2012-08-25 38 views
1

在PHP中再次保护CSRF攻击的最佳方法是什么?在PHP中防止CSRF攻击的最佳方法

建议使用表单标记,因此基本上会生成一个随机值并将其存储在隐藏字段中。然后将这个随机值存储在用户会话中。

最后在表单动作中,确保会话和表单令牌匹配。

if($_SESSION['token'] !== $_POST['token']) { 
    die("bad... spanking..."); 
} 

是否有更好/更简单的方法,因为这需要在我的应用程序(大量的表单和操作)中进行大量的代码修改。

+2

使用CSRF预防令牌是要走的路。 – PeeHaa

回答

2

不可以。为了防止CSRF,您需要确保只有在您有理由相信用户实际提交表单时,才会信任自动附加到请求(如cookie)的凭据。唯一的方法就是让表单携带服务器用来授权处理的某种秘密。

如果您使用框架或库来组成表单,它可能会帮助您生成随机数,设置cookie或会话属性以及向表单添加隐藏的输入,但这三个步骤确实需要发生。

+0

检查'referer'是什么? – Justin

+1

http://www.cgisecurity.com/csrf-faq.html#referer说不:“首先有很多方法可以将Referer头部空白或修改,例如通过网页过滤软件,家长控制软件,隐私软件,代理服务器或者DOM技巧,这使得referer头部本质上不可靠 第二个Referer头文件可以使用XMLHTTP和Amit Klein和rapid7演示的flash来伪造,虽然这些特定的方法已经被厂商修补,用户访问您的网站已经应用了这些补丁,即使他们确实存在第一个问题。“ –

+0

好的,我应该在每个页面上重新生成一个新的'token'吗?因此,每次重新加载都会生成一个新的令牌,将其存储在会话中,并将其设置在隐藏字段中? – Justin