zoukankan      html  css  js  c++  java
  • 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 "<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;
    }
  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/lixiuran/p/3439909.html
Copyright © 2011-2022 走看看