PHP :::安全SESSION_ID :::没有CSRF?

时间:2012-01-27 14:47:27

标签: php session 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}

在这种审查的指纹下,我甚至需要为每个函数调用生成令牌,还是这个实现足以防止CSRF?

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

2 个答案:

答案 0 :(得分:2)

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

通过使用$_SERVER['REMOTE_ADDR']之类的东西生成缩略图所做的一切,从根本上打破了使用网关的人的应用程序(AOL是规范的例子)。

答案 1 :(得分:0)

您可以尝试由Simon Willison编写的CSRF保护课http://simonwillison.net/static/2008/csrf_protect.php.txt

别忘了查看他的博客:http://simonwillison.net:8003/!结婚了!

您也可以尝试:www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) 以及“如何测试CSRF漏洞”部分。

玩得开心