【问题标题】:How to make my code more secure如何让我的代码更安全
【发布时间】:2011-01-10 04:49:12
【问题描述】:

我已经对这个网站所拥有的 cmets 进行了投票(类似的东西),我有点担心可能会滥用 http 请求。在我给你看有问题的代码之后你就会明白我的意思了:

$.ajax({
  type: 'POST',
  url: 'http://localhost/comments/vote_down/' + post_id
});

现在它仍然在本地主机上,但它最终会进入网络。如果有人只是制作了某种脚本,will run n times 这个 url http://localhost/comments/vote_down/post_id 怎么办。

甚至用户身份验证都不是很有帮助,您只需调整您的恶意脚本以进行身份​​验证,您就可以再次执行此操作。我怎样才能使这个请求更安全,我该怎么办?谢谢

编辑

我看到了一些答案,而不是我目前一直在寻找的答案。

也许我期望太高了,有没有一种方法可以在 x 尝试这样做之后,直接拒绝任何人,但有人从 localhost(或 website.com)重定向。

也许是某种标头身份验证?我不是很喜欢这是我问的主要原因。

编辑

还有大约一分钟前我偶然发现的东西,我浏览了几个类似的问题,我的萤火虫打开了,我在收藏夹中添加了一个问题.. 看到控制台帖子回复 200 OK 然后我试了一下就像 10 次只是为了看看我什么时候会被拒绝再次做同样的事情.. 最终我感到无聊.. 所以如果 StackOverflow 没有解决这个问题.. 我要做什么:=)

【问题讨论】:

  • 您不需要拒绝请求。您只需要不执行有关投票的业务逻辑。

标签: php jquery security post


【解决方案1】:

至少,您可以确保每个用户只能投票一次。

  • 如果用户未登录,请勿投票。
  • 如果用户已登录,则将投票限制为每条评论一票(他们是否可以将投票从向上更改为向下取决于您)
  • 如果您想让未注册用户投票,请使用 cookie 和 IP 地址以及用户代理检查将其锁定。 (远非防弹,但会阻止一些麻烦制造者)

其他选项:

  • 实施验证码

响应您的编辑:

如果您谈论的是检查有效的引荐页面,那么您就不走运了。这非常容易被欺骗。您可以实施令牌检查,生成在 X 秒内有效的哈希并拒绝所有具有无效或过期哈希的请求。不过,这不会阻止人们多次投票。

响应您的第二次编辑:

状态码 200 仅表示 http 请求成功,应用程序逻辑决定如何处理请求是完全不同的问题。您可以拒绝投票并返回 200,就像您可以返回 403 一样(但在这种情况下可能更合适)。

【讨论】:

  • 但每次我都在这里成功,它是 "{"Success":true,"NewScore":2,"Message":null,"LastVoteTypeId":null}"
  • 这并不意味着分数改变了,成功的upvote返回: {"Success":true,"NewScore":2,"Message":"","LastVoteTypeId":2} Downvote: {"Success":true,"NewScore":0,"Message":"","LastVoteTypeId":3} 没有任何反应:{"Success":true,"NewScore":1,"Message":null,"LastVoteTypeId ":null}
  • ou ..ok tnx 的解释
【解决方案2】:

我认为您需要跟踪哪些(经过身份验证的)用户对哪些项目进行了投票,并允许每个用户对每个项目仅投票一次。

【讨论】:

    【解决方案3】:

    让用户登录并检查他们是否已经投票赞成/反对,然后需要一个投票表来包含与用户的链接,希望通过 ID。

    希望这会有所帮助,

    【讨论】:

      【解决方案4】:

      除了存储帖子 ID 的投票计数之外,您还需要做更多的事情。您必须为每个单独的投票存储记录。

      一旦为此设置了数据库架构,您就可以开始将附加信息与每个投票相关联——IP 地址、用户 ID 等。

      大多数地方只允许经过身份验证的用户投票,并且只允许用户为任何给定的帖子 ID 投票一次。 Stackoverflow 超越了这一点,允许用户撤消他们的投票并重新投票。

      如果要求用户在投票前进行身份验证是不可接受的,那么您可以通过 IP 地址访问,然后限制能够在某个时间间隔从该 IP 进行投票的数量。例如,一旦从 XXX.XXX.XXX.XXX 投出一票,它在 15 分钟内不能再次投票。这不会破坏代理背后的人的互联网,但会减少可以进行的游戏数量。

      您可以更进一步,尝试检测有人玩弄系统,然后将他们列入黑名单一段时间。

      【讨论】:

      • - Stackoverflow 超越了这一点,允许用户撤销他们的投票并重新投票。我喜欢这个..我也在努力做到这一点
      • 我建议不要通过 IP 地址进行限制,因为这样会阻止大量合法用户。大公司、办公园区和摩天大楼经常 NAT 到单个 IP 地址,实际上一些国家的 ISP 将所有流量通过代理服务器路由,该代理服务器将 IP 替换为代理的 IP。同意存储对用户的投票 - 似乎解决此问题的唯一万无一失的方法是要求经过身份验证的用户。
      【解决方案5】:

      您可以使用 CAPTCHA(我推荐 reCAPTCHA,因为它有助于同时将印刷作品数字化)来消除至少基于机器人的投票。为了防止多个人工投票,请考虑基于半唯一标识符进行计数,例如 IP 地址加上浏览器的用户代理字符串或其他内容。或者根据用户的帐户验证投票(显然在您的用户注册页面上放置一个验证码)。

      【讨论】:

        【解决方案6】:

        您必须通过令牌进行身份验证。

        我可以打印一个<img src="http://localhost/comments/vote_down/1"> 并开始向访问我网站的用户投票。

        您必须做的是服务器端验证,假设您将针对 MD5 哈希进行验证 (md5(1) = c4ca4238a0b923820dcc509a6f75849b)

        http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b
        

        现在在您的服务器上,您必须对 post_id 进行哈希处理并检查哈希参数是否匹配,如果匹配,则允许投票。

        但是我仍然可以在不知情的情况下通过<img src="http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b">继续向用户发送垃圾投票

        您需要做的是对 post_id 和 user_id(来自会话)进行哈希处理,这样一个用户的哈希值不会与另一个用户相同。

        User: 1
        Post_id: 1
        md5(11) = 6512bd43d9caa6e02c990b0a82652dca
        
        User: 2
        Post_id: 1
        md5(12) = c20ad4d76fe97759aa27a0c99bff6710
        

        显然,您应该对哈希函数加盐,但即使没有它,您的应用也将非常安全。

        【讨论】:

        • 我看不出这比将用户 ID 与投票记录关联起来有什么好处。如果没有额外的功能,这似乎是额外的复杂性。
        • 这仍然允许单个用户多次发出有效请求。如果您使每个页面加载的散列值唯一,并在投票后使散列过期,则您已设置。
        【解决方案7】:

        我希望这有助于回答您的问题。看看这个网站:https://panopticlick.eff.org/。基本上,它的作用是尝试根据您的各种系统设置、安装的字体、浏览器功能、时区等来识别您。我刚刚将它发送到我的办公室,到目前为止,我们都是独一无二的。

        现在这种方法并不完全安全,因为您可以通过简单地更改在每次请求时发送到服务器的数据来伪造所有这些信息,但是您必须知道您的网站使用这种技术来平衡攻击(通过默默无闻的安全性)。

        我想我倾向于采用多层次的方法来解决这个问题。因为没有一种方法是完全安全的,所以您所能做的就是将它们叠加起来。

        • 除非启用了 cookie,否则不允许人们投票
        • 为未登录的用户实施验证码
        • 根据用户系统设置的哈希值(安装字体的哈希值、浏览器功能、时区等)分析用户
        • 有一个登录系统,以便用户可以登录投票

        现在,当有人投票时,您可以存储他们的用户 ID(如果他们已登录)、他们的系统哈希和他们的 cookie 来反对他们的投票。这将阻止已登录的用户投票、注销然后再次匿名投票 - 因为他们的系统哈希和 cookie(如果他们没有费心清除它)已经与投票相关联。

        您可以做的其他事情是制作绊线来检测特定帖子的投票是否在任何特定方向上受到打击。如果它受到重创(例如,每分钟 20 票,持续 10 分钟,并且这些票中的很大一部分都朝着同一方向),请尝试通过查看 IP 地址、系统哈希等来分析赞成票。基于任意百分比的可能恶意点击,您可以将该帖子的投票锁定 15 分钟。

        这些方法都不是完全安全的,为了简洁起见,我省略了一些你可以做的事情来轻松扩展这个想法。但我认为多层次的方法是关键。当然,有一天,一个不介意整天解决验证码的真正坚定的用户可能会想出一种方法来操纵您的系统,但只要您有非常好的日志,您就可以分析这种攻击并做出响应。

        希望对你有帮助

        干杯 伊恩

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          相关资源
          最近更新 更多