1.防止crsf攻击的最多解决方案就是 为每个请求生成一个唯一 token ,验证来源于客户端 HTML 表单产生的 POST等请求 .
2.这个token默认放在session中.
slim框架源码中生成方式 如下:
1 <?php 2 //生成name和token 3 $name = uniqid($this->prefix); 4 $token = bin2hex(random_bytes($this->strength)); //strength是一个大于16的数字 5 6 $_SESSION['crsf'][$name] = $token;
验证的时候,如果存在hash_equals函数,会优先这种方式
1 //通过$name获取到对应的值$token, $value为表单提交获取的 2 if (function_exists('hash_equals')) { 3 //hash_equals如果不等返回false 4 $result = ($token !== false && hash_equals($token, $value)); 5 } else { 6 $result = ($token !== false && $token === $value); 7 }
至于为什么先用hash_equals的方案,有什么鸟用,表式不理解.
查了下相关文档,和密码哈希比对安全有关, 具体可以 看
http://bobao.360.cn/learning/detail/398.html
https://blog.whitehatsec.com/magic-hashes/
文章里面大概就是说 如果用 双等号"=="比较密码哈希(十六进制有很小的几率会出现问题), 可以通过 hash_equals 或者 === 或者 !== 比较.