PHP中的CSRF(跨站请求伪造)攻击实例和预防

我有一个网站,人们可以像这样投票:

http://mysite.com/vote/25 

这将对项目25进行投票。我只想让注册用户可以使用,只有当他们想这样做。 现在我知道有人在网站上忙碌,有人给他们这样的链接:

 http://mysite.com/vote/30 

那么他的投票就会放在这个项目上,而他却不想这样做。

我已经阅读了OWASP网站上的解释 ,但是我不太了解它

这是CSRF的一个例子,我怎样才能防止这个。 我能想到的最好的事情就是像链接一样添加链接。 但是,如果把所有的环节都放在一边,这将是相当令人恼火的。 有没有其他的方式做到这一点。

另一件事可能有人可能会给我一些其他的例子,因为该网站似乎相当神职我。

这可能成为CSRF的一个例子,如果:

  • 该链接被提取(例如通过<img>标签) :伪造
  • 从另一个网站:跨网站

例如,如果我可以在stackoverflow的HTML源代码中注入<img>标签(我可以,因为stackoverflow允许在他的post中使用<img>标签)

 <img src="http://mysite.com/vote/30" /> 

你只是投了这个项目;-)

通常使用的解决scheme是在URL中放置一个具有有限生命时间的标记,并在提取URL时检查该标记是否仍然有效。

基本的想法是:

  • 生成页面时:
    • 生成一个唯一的标记
    • 将其存储在用户的会话中
    • 并将其放置在页面的链接中 – 如下所示: http://mysite.com/vote/30?token=AZERTYUHQNWGST : http://mysite.com/vote/30?token=AZERTYUHQNWGST
  • 当投票页面被调用时:
    • 检查标记是否存在于URL中
    • 检查它是否存在于用户的会话中
    • 如果不是=>不要登记投票

这里的想法是:

  • 令牌不会有很长的寿命,而且很难猜测
  • 这意味着你的攻击者
    • 只有几分钟的时间,他的注射是有效的
    • 必须善于猜测^^
    • 将不得不为每个用户生成一个不同的页面。

此外,请注意,用户的会话在离开您的网站后仍保持活动状态的时间越短,访问不良网站时的风险越低。

但是在这里,你必须在安全和用户友好之间做出select。

另一个想法(这不是完全安全的,但有助于对抗的人不知道如何强制POST请求) ,只有当人们投票时才接受POST请求:

  • 浏览器发送GET请求注入标签
  • 由于此URL正在修改一些数据,无论如何,它不应该使用GET,但只能使用POST

但是请注意,这不是非常安全:它可能(可能?)强制/伪造POST请求,并带有一些Javascript。

首先,GET请求不应该用来改变服务器上的状态,所以对于你的投票服务,我会推荐POST / PUT。 这只是一个指引,而是一个切肉刀。

所以对于你的问题,CSRF是一个客户端问题,所以不pipe你使用什么样的服务器语言(在你的情况下是PHP)。 标准的修补程序是相同的,如下所示:在URI / POST数据中具有一个随机值,并在Cookie标头中具有相同的值。 如果这些匹配,你可以肯定没有CSRF。 有很多关于如何在这里完成StackOverflow的信息,例如。 这一个 。
祝你好运!

OWASP有一个针对PHP的CSRFGuard和PHP的ESAPI,我很久以前就写了XMB – > UltimaBB – > GaiaBB。

http://code.google.com/p/gaiabb-olpc/source/search?q=function+get_new_token&origq=function+get_new_token&btnG=Search+Trunk

似乎有些人已经清理了这些代码,并允许使用更强的令牌:

https://www.owasp.org/index.php/PHP_CSRF_Guard

谢谢,安德鲁