博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP防止跨站表单提交与同站跨页伪造表单的攻击
阅读量:6533 次
发布时间:2019-06-24

本文共 1417 字,大约阅读时间需要 4 分钟。

hot3.png

在以前的防止跨站攻击的时候,使用了验证提交的页面是否是同一个站点,这样可以防止普通的攻击,ereg("blog.qita.in",$_SERVER['HTTP_REFERER'])

不过也不是很安全的,因为攻击者可以伪造HTTP Referer,如 header("Referer: blog.qita.in"); 或者在恶意脚本中伪造HTTP头
由于HTTP Referer是由客户端浏览器发送的,而不是由服务器控制的,因此你不应当将该变量作为一个信任源。
当然登录的时候可以使用验证码来解决,不过其他很多表单提交还是不适宜。
下面给出一个防止伪造表单提交的方案,还解决了同一个站点不同页面的非法调用!
//--------------- 代码 -------------//
session_start();
#随机取6位的散列值
function gen_token() {
$hash = md5(uniqid(rand(), true));
$n = rand(1, 26);
$token = substr($hash, $n, 6);
return $token;
}
function ck_form(){
if (_POST('qm_token')=='' || _SESSION('token')=='' || _POST('qm_token') != _SESSION('token')){
 exit('请勿非法提交');
 }
}
function token_input(){
$token = gen_token();
$_SESSION['token']= $token;
echo "<input type='hidden' name='qm_token' value='$token'/>";
}
//使用方法,注意先后顺序
if(_POST('add')!=''){
 #提交表单的时候验证提交页面的合法性
 ck_form();
正常CODE...
}
<form name="form1" action="" method="post">
 <?php token_input();?>
其他HTML...
</form>
//------------ 代码结束 -------------//
原理:当不同的页面跨站或同站非法跨页提交表单的时候
跨站时获取的隐藏域和SESSION值都为空,可以判断是非法提交,因为合法页面的SESSION和隐藏域我赋了同样的散列值。
同站时SESSION值和POST得到的隐藏域的值不会相同,所以也可以判断是非法提交。
 
NOTE:
function _POST($str){
    $val = !empty($_POST[$str]) ? $_POST[$str] : null;
    return $val;
}
function _GET($str){
    $val = !empty($_GET[$str]) ? $_GET[$str] : null;
    return $val;
}
function _SESSION($str){
    $val = !empty($_SESSION[$str]) ? $_SESSION[$str] : null;
    return $val;
}

转载于:https://my.oschina.net/pureboys/blog/173409

你可能感兴趣的文章
兄弟连区块链教程区块链背后的信息安全2DES、3DES加密算法原理二
查看>>
1.3创建项目「深入浅出ASP.NET Core系列」
查看>>
《快学 Go 语言》第 3 课 —— 分支与循环
查看>>
一个ViewGroup#dispatchDraw()中的NP分析
查看>>
五大常用算法简述
查看>>
Windows下leapmotion中touchless的使用
查看>>
贺建奎:愿意用自己孩子第一个尝试,研究不小心泄露,英美也有类似实验
查看>>
认真的做羞羞的事 一颗种子的自我分享
查看>>
数据库迁移
查看>>
你应该了解的大数据10个新趋势
查看>>
Java 实现阿里云短信
查看>>
CPU 已不足以驱动屏幕指纹识别技术,于是 vivo 用 DSP 来加速
查看>>
设计模式 (23种)
查看>>
Intellij IDEA 2017.3 基于编辑器的REST客户端介绍
查看>>
nodejs爬虫
查看>>
进程间通信基础知识
查看>>
C#6.0 十大常用特性
查看>>
MP实战系列(一)之入门框架搭建和使用
查看>>
JavaScript高级程序设计学习(四)之引用类型
查看>>
CSS > 译文:理解CSS中的块级格式化上下文
查看>>