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;
    }
  • 相关阅读:
    bootstrap4 css源码分析
    ArcGIS使用Python脚本进行地理处理
    Geotools例子2 扩展,解析geojson文件保存为shp
    Geotools例子2,解析csv文件保存为shp
    geotool案例1,快速显示shapefile
    Postgresql+Geoserver+Openlayers+pgRouting学习1
    Python开发——7.迭代器、生成器和装饰器
    Python开发——6.文件操作
    Python开发——5.函数
    Python开发——4.集合和字符串拼接
  • 原文地址:https://www.cnblogs.com/lixiuran/p/3439909.html
Copyright © 2011-2022 走看看