php防止伪造跨站请求实现程序
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-23 08:57:02 浏览: 评论:0
CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任何限制,所以攻击者可以先预测好请求的参数,在站外的Web页面里编写javascript脚本伪造文件请求或和自动提交的表单来实现GET、POST请求,用户在会话状态下点击链接访问站外的Web页面,客户端就被强迫发起请求.
浏览器的安全缺陷
现在的Web应用程序几乎都是使用Cookie来识别用户身份以及保存会话状态,但是所有的浏览器在最初加入Cookie功能时并没有考虑安全因素,从 WEB页面产生的文件请求都会带上COOKIE,如下所示,Web页面中的一个正常的图片所产生的请求也会带上COOKIE:
<img src=”http://website/logo.jpg”>
GET http://website.com/log.jpg
Cookie:session_id,客户端,服务器,咱们按照这个思路,山寨一个crumb的实现,代码如下:
- class Crumb {
- CONST SALT = "your-secret-salt";
- static $ttl = 7200;
- static public function challenge($data) {
- return hash_hmac('md5', $data, self::SALT);
- }
- //开源代码phpfensi.com
- 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进行检查,代码如下:
- if(Crumb::verifyCrumb($uid, $_POST['crumb'])) {
- //按照正常流程处理表单
- } else {
- //crumb校验失败,错误提示流程
- }
注意:CSRF攻击和相关web蠕虫的爆发,并且针对这类web攻击制定有效的应急措施,同建议程序员不要滥用$_REQUEST类变量,在必要的情况下给某些敏感的操作加上水印,考虑使用类似DISCUZ论坛的formhash技术提高黑客预测请求参数的难度,注意JSON数据接口的安全问题等.
Tags: php防止 php伪造跨站请求
相关文章
- ·php中防止重复提交数据程序代码(2014-07-29)
- ·PHP防CC攻击与防止快速刷新页面例子(2014-08-21)
- ·php防止站外远程提交表单例子(2014-08-21)
- ·PHP登录中的防止sql注入方法分析(2014-08-21)
- ·php 防止查询的sql攻击方法总结(2014-08-21)
- ·PHP防止远程非法提交表单程序代码(2014-08-22)
- ·php防止恶意刷新与刷票实现代码(2014-08-22)
- ·php防止sql注入原理介绍(2014-08-22)
- ·php防止sql注入之过滤分页参数(2014-08-22)
- ·php网站防止刷流量攻击方法(2014-08-22)
- ·php防止重复刷票原理分析(2014-08-23)
- ·php 防止sql注入的有效处理方法(2014-08-23)
- ·php记录IP方式来防止表单重复提交(2014-09-21)
- ·php防止网站被f5刷新的例子(2014-09-22)
- ·php 防止SQL注入的几种方法(2015-04-13)
- ·php 防止表单重复提交几种方法(2016-01-28)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)