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。
似乎有些人已经清理了这些代码,并允许使用更强的令牌:
https://www.owasp.org/index.php/PHP_CSRF_Guard
谢谢,安德鲁