如何使我的代码更安全

时间:2010-01-27 23:21:04

标签: php jquery security post

我对像这个网站上的评论(类似的东西)进行了投票,我稍微担心可能的http请求被滥用。在向您展示可疑代码后,您会明白我的意思:

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

现在它仍然在localhost上,但最终会进入网络。如果某人只是制作will run n times此网址http://localhost/comments/vote_down/post_id的某种脚本,该怎么办?

即使用户身份验证非常有用,您只需调整恶意脚本进行身份验证,然后再进行身份验证即可。如何使此请求更安全,我该怎么办?谢谢

修改

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

也许我期待太多,有什么方法可以直接拒绝这个请求给任何人,但是在x尝试这样做之后,有人从localhost(或website.com)重定向。

也许某种头认证?我不是很了解这就是我问的主要原因。

修改

也是我大约一分钟左右意外发现的,我正在浏览几个类似的问题而且我的萤火虫已经开启了,我向收藏夹添加了一个问题..看到控制台发布回复200 OK然后我试过了它只有10次才能看到我什么时候会被拒绝再做同样的事情...最终我感到无聊..所以如果StackOverflow没有解决那个问题......我想做什么:=)

7 个答案:

答案 0 :(得分:6)

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

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

其他选项:

  • 实施验证码

回复您的修改:

如果您正在讨论检查有效的推荐网页,那么您运气不佳。这非常容易被欺骗。您可以实现令牌检查,您可以在其中生成有效X秒的散列,并拒绝所有具有无效或过期散列的请求。这不会阻止人们多次投票。

响应您的第二次修改:

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

答案 1 :(得分:3)

您需要做的不仅仅是存储帖子ID的投票方式。您将不得不为每个投票存储一条记录。

为此设置数据库架构后,您可以开始将其他信息与每个投票相关联 - IP地址,用户ID等。

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

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

您可以更进一步,尝试检测某人游戏系统,然后将其列入黑名单一段时间。

答案 2 :(得分:1)

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

我可以打印一个<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

显然,你应该使用散列函数,但即使没有它,你的应用程序也会非常安全。

答案 3 :(得分:1)

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

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

我认为我倾向于对问题采取多层次的方法。因为没有一种方法是完全安全的,所以你所能做的就是叠加它们。

  • 除非启用了Cookie,否则不允许人们投票
  • 为未登录的用户实施CAPTCHA
  • 根据系统设置的哈希值(已安装字体的哈希值,浏览器功能,时区等)对用户进行配置。
  • 拥有登录系统,以便用户可以登录投票

现在,当有人投票时,你存储他们的用户ID(如果他们已经登录),他们的系统哈希和他们的cookie反对他们的投票。这将阻止登录用户进行投票,注销,然后再匿名投票 - 因为他们的系统哈希和cookie(如果他们没有打算清除它)将已经与投票挂钩。

你可以做的其他事情是做一个tripwire来检测特定邮件的投票是否在任何特定方向受到重创。如果它受到重创(比如,10分钟内每分钟20票,并且这些投票的很大一部分都在同一方向),尝试通过查看IP地址,系统哈希等来分析投票。基于任意百分比的可能恶意命中,你可以锁定该帖子的投票15分钟。

这些方法都不是完全安全的,为了简明扼要,我遗漏了一些你可以轻松扩展这个想法的事情。但我认为多层次的方法是关键。当然,有一天,一个真正坚定的用户不介意整天解决验证码可能会找到一种方法来装配您的系统,但只要您拥有非常好的日志,您就能够对此攻击进行分析并做出响应。

希望这有帮助

干杯 伊恩

答案 4 :(得分:0)

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

答案 5 :(得分:0)

让用户登录并检查他们是否已经上/下投票,之后需要投票表以包含与用户的链接,希望通过ID。

希望这有帮助,

答案 6 :(得分:0)

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