php 防伪造表单,PHP防止跨站表单提交与同站跨页伪造表单的攻击

在以前的防止跨站攻击的时候,使用了验证提交的页面是否是同一个站点,这样可以防止普通的攻击,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 "";

}

//使用方法,注意先后顺序

if(_POST('add')!=''){

#提交表单的时候验证提交页面的合法性

ck_form();

正常CODE...

}

其他HTML...

//------------ 代码结束 -------------//

原理:当不同的页面跨站或同站非法跨页提交表单的时候

跨站时获取的隐藏域和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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值