如何让我的代码更加安全

问题描述:

我对这个网站上的评论(类似的东西)做了一个投票,而且我对可能的http请求滥用情况略有担心。你会明白我的意思后,我告诉你有问题的代码:如何让我的代码更加安全

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

现在,它仍然在本地主机,但它会得到网站最终。如果有人只是做了某种脚本will run n times此网址http://localhost/comments/vote_down/post_id

甚至没有用户身份验证是非常有用的,你只需调整你的恶意脚本进行身份验证,你可以再次做到这一点。我如何使这个请求更安全,我该怎么办?谢谢

编辑

我看到一些答案,而我一直在寻找迄今的。

也许我期待太多了,有没有办法可以直接拒绝这个请求给任何人,除非有人尝试这样做,否则有人从localhost(或website.com)重定向。

也许某种头认证?我不是那么认为这就是我问的主要原因。

编辑

还什么我不期而遇发现约一分钟左右前,我在浏览低谷几个类似的问题,我的萤火虫是,我增加了一个问题,在您的收藏..看到控制台响应后200 OK然后,我试了10次,只是为了看看我什么时候会被拒绝再次做同样的事情。最终我感到无聊..所以,如果*没有解决..我在做什么:=)

+1

你不需要拒绝请求。您只需要执行有关投票的业务逻辑。 – 2010-01-28 00:13:08

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

  • 如果用户没有登录,请不要投票。
  • 如果用户已经登录,每个评论限制投票为一票(他们是否可以改变投票从上到下取决于你)
  • 如果你想让未注册的用户投票, cookies和ip地址以及useragent检查。 (远离防弹,但会保留一些闹事者在海湾)

附加选项:

  • 实现Captcha

在回答您的编辑:

如果你是谈论检查一个有效的推荐页面,你是运气不好。这非常容易被欺骗。您可以实施令牌检查,在该检查中生成一个有效时间为X秒的散列,并拒绝包含无效或过期散列的所有请求。这不会阻止人们多次投票。

在回答你的第二个编辑:

的200状态码仅意味着该HTTP请求是成功的,哪些应用程序逻辑决定与要求做是完全不同的问题。你可以拒绝投票并返回一个200,就像你可以返回一个403(尽管这样可能会更合适)。

+0

@Whover downvoted:发布一个理由会很好:) – 2010-01-27 23:42:16

+0

但是,每次我做了我在这里获得成功,它是“{”成功“:真,”NewScore“:2,”消息“:空,”LastVoteTypeId“: null}“ – 2010-01-27 23:44:28

+0

这并不意味着得分发生了变化,成功的upvote返回: {”Success“:true,”NewScore“:2,”Message“:”“,”LastVoteTypeId“:2} Downvote: { “成功”:真 “NewScore”:0, “消息”: “”, “LastVoteTypeId”:3} 什么也没有发生: { “成功”:真 “NewScore”:1,”消息“:null,”LastVoteTypeId“:null} – 2010-01-27 23:47:53

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

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

希望这有助于

你将不得不做的比存储票理货后ID的更多。您将不得不为每个投票存储记录。

一旦你的数据库模式设置为,您就可以开始与每票附加信息相关联 - 一个IP地址,用户ID等

大多数地方只允许通过认证的用户投票,并只允许一个用户为任何给定的帖子ID投票一次。 *超越了这一点,并允许用户取消他们的选票并重新进行设置。

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

你可以走得更远,尝试探测某人正在游戏系统,然后将其列入黑名单一段时间。

+0

- Stackoverfl ow超越了这一点,并允许用户取消他们的选票并重新进行表决。我喜欢这个..我也试图做到这一点 – 2010-01-27 23:30:46

+1

我可以推荐反对IP地址限制,因为你会阻止大量的合法用户。大型公司,办公园区和摩天大楼通常将NAT转换为一个IP地址,事实上,一些国家的ISP通过代理服务器路由所有流量,代理服务器用代理IP代替IP。 虽然同意存储对用户的投票,但似乎解决这个问题的唯一方法是通过要求经过身份验证的用户。 – realworldcoder 2010-01-28 00:57:21

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

您必须通过令牌认证。

潜在的,我可以只打印<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(从Session),这样一个散列从一个用户的好评和其他人一样。

User: 1 
Post_id: 1 
md5(11) = 6512bd43d9caa6e02c990b0a82652dca 

User: 2 
Post_id: 1 
md5(12) = c20ad4d76fe97759aa27a0c99bff6710 

很明显,你应该使用哈希函数,但即使没有它,你的应用程序也会非常安全。

+0

这样一个好主意! :D – 2010-01-27 23:54:08

+0

我没有看到这只是将用户ID与投票记录相关联而获得的结果。没有额外的功能似乎是额外的复杂性。 – 2010-01-28 00:06:22

+1

这仍然允许单个用户多次提出有效的请求。如果您使每个页面负载的哈希值都是唯一的,并且在投票投票后过期哈希值,则会进行设置。 – sfrench 2010-01-28 00:07:37

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

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

我想我会倾向于采取多层次的方法来解决这个问题。因为没有任何方法是完全安全的,所有你可以做的就是把它们堆叠起来。

  • 不要让市民投票,除非他们已经启用Cookie
  • 基于安装的字体(哈希他们的系统设置的哈希值在
  • 档案用户未登录用户谁实施CAPTCHA,浏览器功能,时区等)
  • 有一个登录系统,这样用户就可以登录到投票

现在,当有人票,您存储的用户ID(如果他们已经登录),他们的系统哈希和其合作对他们的投票okie。这将防止登录用户进行投票,注销和匿名投票 - 因为他们的系统哈希和cookie(如果他们没有打扰清除它)已经被绑定到投票。

你可以做的其他事情是做一个tripwire来检测某个特定帖子上的投票是否在任何特定方向受到敲击。如果它受到敲击(例如,10分钟内每分钟20张投票,并且很大比例的投票都在同一个方向),请尝试通过查看IP地址,系统散列等来分析upvotes。基于任意百分比的可能的恶意命中,你可以锁定投票15分钟。

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

希望这有助于

干杯 伊恩