如何有效防范伪造跨站请求
什么是伪造跨站请求伪造跨站请求是一种难以防范的攻击方式,攻击者可以通过伪造请求进行恶作剧、发垃圾信息、删除数据等危害。通常表现为伪造链接引诱用户点击或在用户不知情的情况下访问,以及伪造表单引诱用户提
什么是伪造跨站请求
伪造跨站请求是一种难以防范的攻击方式,攻击者可以通过伪造请求进行恶作剧、发垃圾信息、删除数据等危害。通常表现为伪造链接引诱用户点击或在用户不知情的情况下访问,以及伪造表单引诱用户提交,表单可能隐藏、用图片或链接伪装。
常见防范手段
一种常见且廉价的防范手段是在所有涉及用户写操作的表单中加入一个随机且频繁变换的字符串,在处理表单时对该字符串进行检查。如果随机字符串与当前用户身份相关联,那么攻击者要伪造请求就会变得更加困难。Facebook等平台也采取类似措施,在表单中常添加像`.crumb`、`post_form_id`和`fb_dtsg`等字段来防范伪造跨站请求。
实现随机串代码
按照上述思路,实现一个名为crumb的随机串代码,代码如下:
```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;
}
}
```
构造包含随机串的表单
在表单中插入一个隐藏的随机串crumb:
```html
```
对随机串进行检查
在处理表单时,需要对随机串crumb进行验证:
```php
if(Crumb::verifyCrumb($uid, $_POST['crumb'])) {
// 处理表单
} else {
// 错误提示
}
```
通过上述方法,可以有效防范伪造跨站请求的攻击,保护用户数据安全和系统正常运行。在网站开发中,务必重视安全性,避免因漏洞而导致信息泄露或损害。