2013-11-01 55 views
4

我试图使用表单密钥方法csrf protection这里http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/。但它仅适用于页面上的一个表格。我的问题是csrf的保护

假设我有一个形式

<form action="action.php" method="post"> 
<!-- code here --> 
</form> 

和我的PHP我使用

<?php 
if(isset($_POST['submit']) && isset($_SESSION['user'])) 
{ 
//do something 
} 

我已经使用session user确认他是否已登录并和形式由我的网站提交,因为会议已在我的网站上进行。我是否也必须使用csrf保护方法?

回答

4

我是否也必须使用csrf保护方法呢?

是的,因为这正是为什么CSRF是危险的;当他们在另一个网站上提交修改后的表单时,“受害者”的cookie会在不知情的情况下发送给服务器,以便代表“黑客”执行特定操作,例如,由可爱的小猫照片伪装(例如)。

当提交变相形式时,您的站点无法区分请求和合法请求,因为身份验证是有效的。添加CSRF令牌可确保表单是从网站上的页面提交的。

创建会话时,您还会生成一个CSRF令牌。此令牌随后将用于会话期间您网站上的所有表单;这样做可以防止同时打开多个选项卡的问题。

即使表单从您的页面复制(包括CSRF令牌),该令牌也将存储在不属于经过验证的用户的会话中。

+0

假设我使用会话方法,其中我生成一个表单键,并将密钥发送到PHP验证的地方。现在的问题是,如果在两个选项卡中打开同一页面,并且我刷新新页面并关闭它。 '会话变量改变'。现在,当我提交第一个选项卡上的表单。它总是会出错。有时候用户会这样'在2个选项卡中打开相同的页面'。是否还有其他安全的csrf保护方法? – Ace

+3

@ user2894116 - 创建会话时生成令牌,而不是每次加载表单时都生成令牌。 – Quentin

+0

@Jack道歉! 。这个ajax方法需要很多代码,因为我的页面上有很多表单。这里用其他方式代码少,安全性相同吗? – Ace