我有一个网站,人们可以这样投票:
http://mysite.com/vote/25这将对项目25进行投票。我只想让注册用户可以使用它,而且只有当他们想这样做的时候。现在我知道当有人在网站上忙碌时,有人会给他们一个这样的链接:
http://mysite.com/vote/30然后,投票将是他在项目上的位置,而不是他想要这样做。
我读过explanation on the OWASP website,但我真的不太懂
这是CSRF的一个例子吗?我如何防止这种情况。我能想到的最好的办法就是在链接中添加一些东西,比如哈希。但这将是相当恼人的,把一些东西在所有链接的末尾。没有其他方法可以做到这一点。
另一件事,也许有人可以给我一些其他的例子,因为这个网站对我来说似乎相当模糊。
发布于 2010-03-27 04:38:13
在以下情况下,这可能成为CSRF的示例:
从另一个站点伪造链接(例如,通过<img>标记):
例如,如果我可以在stackoverflow的HTML源代码中注入这个<img>标记(我也可以,因为stackoverflow允许在他的帖子中使用<img>标记):
<img src="http://mysite.com/vote/30" />你会直接投票给那个项目;-)
通常使用的解决方案是在URL中放置一个生命周期有限的令牌,并在获取URL时检查该令牌是否仍然有效。
基本的想法是:
http://mysite.com/vote/30?token=AZERTYUHQNWGST
中
这里的想法是:
< user.
>H144>必须为每个Token生成不同的页面
此外,请注意,用户离开网站后保持活动的时间越短,当他访问不好的网站时,会话仍然有效的风险就越小。
但在这里,你必须在安全性和用户友好性之间做出选择。
另一个想法(这不是完全安全的,但有助于防止那些不知道如何强制POST请求的人),那就是在人们投票时只接受POST请求:
一起工作
但请注意,这并不是完全安全的:它(可能?)可以使用一些Javascript来强制/伪造POST请求。
发布于 2010-03-27 04:43:37
首先,GET请求不应该用来改变服务器上的状态,所以对于您的投票服务,我建议使用POST/PUT。这只是一个指导方针,但很聪明。
因此,对于您的问题,CSRF是一个客户端问题,所以您使用哪种服务器语言(在本例中为PHP)并不重要。标准修复是相同的,是这样的:在URI/POST-data中有一个随机值,在Cookie头中有相同的值。如果这些匹配,您可以确定没有CSRF。在StackOverflow上有很多关于如何做到这一点的信息,例如。this one。
祝好运!
发布于 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
谢谢,安德鲁
https://stackoverflow.com/questions/2526522
复制相似问题