跨站点请求伪造
很难防止跨站请求伪造,而且危害很大,通过这种方式,攻击者可以发送垃圾邮件信息、恶作剧、删除数据等:
伪造链接,引诱用户点击,或让用户访问不知情的情况。
伪造的形式,吸引用户提交。形式可以隐藏和伪装在图片或链接的形式。
更常见和更便宜的预防措施是向所有可能涉及用户写操作的表单添加一个随机且频繁变化的字符串,然后在处理表单时检查字符串。如果此随机字符串与当前用户标识相关联,攻击者伪造请求将更麻烦。
雅虎是应对跨站请求伪造加入A.屑随机字符串的形式的方式;而脸谱网也有类似的解决方案,往往有post_form_id fb_dtsg及其形式。
随机串行代码实现
我们遵循这个想法,山村一块屑的实现,代码如下:
复制代码代码如下所示:
< PHP
类屑{
常量盐=你的秘密盐;
静态$ = 7200;
静态公共函数挑战($数据){
返回hash_hmac('md5 ',美元的数据,自::盐);
}
静态公共功能issuecrumb($ UID,$行动= 1){
我=细胞(时间() /::$ TTL);
返回substr(自::挑战美元美元(即行动。$ UID),12, 10);
}
静态公共功能verifycrumb(美元美元美元的UID,碎屑,行动= 1){
我=细胞(时间() /::$ TTL);
如果(substr(自::挑战美元美元(即行动。$ UID),12, 10)= = $屑| |
substr(自::挑战(($我- 1)。为行动。$ UID),12, 10)= = $屑)
返回true;
返回false;
}
}

代码中的$ UID代表用户的独特身份,和$ TTL表示的随机字符串的有效时间。
应用实例
结构形式
在表格中插入一个隐藏的随机面包屑串。
复制代码代码如下所示:

>




处理的形式demo.php
检查点
复制代码代码如下所示:
< PHP
如果(面包屑::verifycrumb($ UID,_post美元{ 'crumb ' })){
按照正常形式处理
{人}
{面包屑检测失败,错误提示进程
}
>