首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中CSRF (Cross-site request forgery)攻击实例及防范

PHP中CSRF (Cross-site request forgery)攻击实例及防范
EN

Stack Overflow用户
提问于 2010-03-27 04:29:20
回答 4查看 80.9K关注 0票数 53

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

代码语言:javascript
复制
http://mysite.com/vote/25

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

代码语言:javascript
复制
http://mysite.com/vote/30

然后,投票将是他在项目上的位置,而不是他想要这样做。

我读过explanation on the OWASP website,但我真的不太懂

这是CSRF的一个例子吗?我如何防止这种情况。我能想到的最好的办法就是在链接中添加一些东西,比如哈希。但这将是相当恼人的,把一些东西在所有链接的末尾。没有其他方法可以做到这一点。

另一件事,也许有人可以给我一些其他的例子,因为这个网站对我来说似乎相当模糊。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-27 04:38:13

在以下情况下,这可能成为CSRF的示例:

从另一个站点伪造链接(例如,通过<img>标记):

例如,如果我可以在stackoverflow的HTML源代码中注入这个<img>标记(我也可以,因为stackoverflow允许在他的帖子中使用<img>标记):

代码语言:javascript
复制
<img src="http://mysite.com/vote/30" />

你会直接投票给那个项目;-)

通常使用的解决方案是在URL中放置一个生命周期有限的令牌,并在获取URL时检查该令牌是否仍然有效。

基本的想法是:

  • 在生成页面时:
    • 生成一个唯一的令牌
    • ,将其存储在用户的会话
    • 中,并将其放置在页面的链接中--如下所示:http://mysite.com/vote/30?token=AZERTYUHQNWGST

  • 当投票页面被调用时:
    • 检查令牌是否存在于vote

  • 检查它是否存在于用户的会话中

  • 如果不存在=>则不注册URL

这里的想法是:

  • 令牌的生命周期不长,并且很难猜测
  • ,这意味着攻击者:
    • 只有几分钟的时间窗口,在此期间他的注入将有效
    • 必须擅长猜测^^

    < user.

>H144>必须为每个Token生成不同的页面

此外,请注意,用户离开网站后保持活动的时间越短,当他访问不好的网站时,会话仍然有效的风险就越小。

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

另一个想法(这不是完全安全的,但有助于防止那些不知道如何强制POST请求的人),那就是在人们投票时只接受POST请求:

  • 浏览器正在为插入的标记
  • 发送GET请求,因为此URL正在修改某些数据,但无论如何,它不应与GET一起工作,而只能与POST

一起工作

但请注意,这并不是完全安全的:它(可能?)可以使用一些Javascript来强制/伪造POST请求。

票数 95
EN

Stack Overflow用户

发布于 2010-03-27 04:43:37

首先,GET请求不应该用来改变服务器上的状态,所以对于您的投票服务,我建议使用POST/PUT。这只是一个指导方针,但很聪明。

因此,对于您的问题,CSRF是一个客户端问题,所以您使用哪种服务器语言(在本例中为PHP)并不重要。标准修复是相同的,是这样的:在URI/POST-data中有一个随机值,在Cookie头中有相同的值。如果这些匹配,您可以确定没有CSRF。在StackOverflow上有很多关于如何做到这一点的信息,例如。this one

祝好运!

票数 19
EN

Stack Overflow用户

发布于 2013-02-04 12:15:41

OWASP有一个用于PHP的CSRFGuard,以及我很久以前为XMB -> UltimaBB -> GaiaBB编写的用于PHP的ESAPI。

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

谢谢,安德鲁

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2526522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档