PHP ::: secure SESSION_ID ::: no CSRF?


PHP ::: secure SESSION_ID ::: no 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来说,这太长了吗
::当我说安全函数时,我的意思是可以通过使用相同的nonce或令牌来保护函数。

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

使用$_SERVER['REMOTE_ADDR']之类的东西生成指纹所做的一切,都会从根本上破坏使用网关的人的应用程序(AOL就是典型的例子)。

您可以尝试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漏洞"部分。

玩得开心