2012-01-27 48 views
0

使用此:PHP ::: secure SESSION_ID :::否CSRF?

function nonce($str,$expires){ 
return sha1(date('Y-m-d H:i',ceil(time()/$expires)*$expires).$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$salt.$str); 
} 

比方说,我初始化我的session_id我登录后,也产生指纹,就像这样:

session_regenerate_id(); 
$_SESSION['thumbprint']=nonce(session_id().'thumbprint',86400); 

并调用这些:

function valid_session(){ 
    return ($_SESSION['thumbprint']==nonce(session_id().'thumbprint',86400)); 
} 

function logged_in(){ 
    return (valid_session()&&isset($_SESSION['user']['id'])&&isset($_SESSION['user']['typeid'])&&isset($_SESSION['user']['email'])); 
} 

在每页顶部:

if(logged_in==false){//logout & redirect back to index} 

有了这样的审查拇指指纹,我甚至需要为每个函数调用令牌或这种implimentation足以防止CSRF?

::: 86400是24小时,我意识到是很长一段时间。对于一个唯一的ID来说,这太久了?
:::当我说安全功能时,我的意思是可以通过使用相同的随机数或令牌来保护函数。

回答

2

只需使用一次性表单提交表单提交。 uniqid()就足够了。生成时将令牌存储在会话中,并将其包含在表单中。然后在您的表单POST处理脚本中,检查以确保发布的值是会话中的值。

通过使用诸如$_SERVER['REMOTE_ADDR']之类的东西来生成指纹,您所做的只是为使用网关的用户打破了您的应用(AOL是典型示例)。

+0

好吧,让我们说我拿出$ _SERVER ['REMOTE_ADDR'],然后离开$ _SERVER ['HTTP_USER_AGENT']。$ salt。$ str ...仍然是一个非常安全的随机数。但是在每个页面的顶部调用logged_in()足以防止CSRF?...因为我仍在检查唯一的ID。 – 2012-01-27 15:07:56

+0

定义“安全”。因为你所做的事情完全没有必要,而且也没有我建议的那么安全。但是,它确实打破了AJAX请求(由于在每个请求中使用了'session_regenerate_id()',导致竞争条件),使用Back按钮在前一页上创建表单(由于您的随机数取决于session_id())), etc. – FtDRbwLXw6 2012-01-27 16:13:27

+0

以及没有session_regenerate_id()仅用于登录,我应该做得更清楚。 – 2012-01-27 16:35:38