使用此:
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? :::当我说安全功能时,我的意思是可以通过使用相同的随机数或令牌来保护功能。
答案 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漏洞”部分。
玩得开心