yahoo 对付伪造跨站请求的办法是在表单里加入一个叫. crumb 的随机串; 而 facebook 也有类似的解决办法, 它的表单里常常会有 post_form_id 和 fb_dtsg
比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串, 然后在处理表单的时候对这个字符串进行检查这个随机字符串如果和当前用户身份相关联的话, 那么攻击者伪造请求会比较麻烦现在防范方法基本上都是基于这种方法的了
随机串代码实现
咱们按照这个思路, 山寨一个 crumb 的实现, 代码如下:
代码如下:
- class Crumb {
- CONST SALT = "your-secret-salt";
- static $ttl = 7200;
- static public
- function challenge($data) {
- return hash_hmac('md5', $data, self: :SALT);
- }
- static public
- function issueCrumb($uid, $action = -1) {
- $i = ceil(time() / self: :$ttl);
- return substr(self: :challenge($i.$action.$uid), -12, 10);
- }
- static public
- function verifyCrumb($uid, $crumb, $action = -1) {
- $i = ceil(time() / self: :$ttl);
- if (substr(self: :challenge($i.$action.$uid), -12, 10) == $crumb || substr(self: :challenge(($i - 1).$action.$uid), -12, 10) == $crumb) return true;
- return false;
- }
- }
代码中的 $uid 表示用户唯一标识, 而 $ttl 表示这个随机串的有效时间
应用示例
构造表单
在表单中插入一个隐藏的随机串 crumb
代码如下:
处理表单 demo.php
对 crumb 进行检查
代码如下:
- if(Crumb::verifyCrumb($uid, $_POST['crumb'])) {
- // 按照正常流程处理表单
- } else {
- //crumb 校验失败, 错误提示流程
- }
来源: https://www.php1.cn/detail/php-fb413f5525.html