Aiweb首页>>WEB文章>> PHP源码
2012/10

防止伪造跨站请求的小招式

时间:2012-10-23 09:06:51作者:守望麦田点击:1095次

防止伪造跨站请求的小招式
伪造跨站请求介绍伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。这种攻击常见的表现形式有:
伪造链接,引诱用户点击,或是让用户在不知情的情况下访问伪造表单,引诱用户提交。表单可以是隐藏的,用图片或链接的形式伪装。
比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。

yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。
随机串代码实现,代码如下:
<?php
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 <form method="post" action="demo.php">
<input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>">
<input type="text" name="content">
<input type="submit">
</form>
处理表单 demo.php对crumb进行检查
<?php
          if(Crumb::verifyCrumb($uid, $_POST['crumb'])) { //按照正常流程处理表单
} else { 
          //crumb校验失败,错误提示流程 }
?>

更多

作者:守望麦田

文章地址:http://www.aiweb.com.cn/article/article-17-8.html

如果你觉得文章很精典,你可以推荐给你的朋友看!

上一篇:REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
下一篇:PHP上传文件大小设置
相关文章:
防止伪造跨站请求的小招式
REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
PHP上传文件大小设置
php中HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR的使用