PHP防止跨站表单提交与同站跨页伪造表单的攻击
在以前的防止跨站攻击的时候,使用了验证提交的页面是否是同一个站点,这样可以防止普通的攻击,ereg(" www.rczjp.com",$_SERVER['HTTP_REFERER' ]) 不过也不是很安全的,因为攻击者可以伪造HTTP Referer,如 header("Referer: www.rczjp.cn "); 或者在恶意脚本中伪造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(); 正常 www.2cto.com 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; }
查看更多关于PHP防止跨站表单提交与同站跨页伪造表单的攻击的详细内容...