zoukankan      html  css  js  c++  java
  • 执行CSRF令牌所有形式使用POST方法

    从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性。

    php CSRF Guard
    function csrfguard_generate_token($unique_form_name)
    {
    if (function_exists("hash_algos") and in_array("sha512",hash_algos()))
    {
    $token=hash("sha512",mt_rand(0,mt_getrandmax()));
    }
    else
    {
    $token=' ';
    for ($i=0;$i<128;++$i)
    {
    $r=mt_rand(0,35);
    if ($r<26)
    {
    $c=chr(ord('a')+$r);
    }
    else

    $c=chr(ord('0')+$r-26);

    $token.=$c;
    }
    }
    store_in_session($unique_form_name,$token);
    return $token;
    }
    function csrfguard_validate_token($unique_form_name,$token_value)
    {
    $token=get_from_session($unique_form_name);
    if ($token===false)
    {
    return false;
    }
    elseif ($token===$token_value)
    {
    $result=true;
    }
    else

    $result=false;

    unset_session($unique_form_name);
    return $result;
    }
    function csrfguard_replace_forms($form_data_html)
    {
    $count=preg_match_all("/<form(.*?)>(.*?)<\/form>/is",$form_data_html,$matches,PREG_SET_ORDER);
    if (is_array($matches))
    {
    foreach ($matches as $m)
    {
    if (strpos($m[1],"nocsrf")!==false) { continue; }
    $name="CSRFGuard_".mt_rand(0,mt_getrandmax());
    $token=csrfguard_generate_token($name);
    $form_data_html=str_replace($m[0],
    "<form{$m[1]}>
    <input type='hidden' name='CSRFName' value='{$name}' />
    <input type='hidden' name='CSRFToken' value='{$token}' />{$m[2]}</form>",$form_data_html);
    }
    }
    return $form_data_html;
    }
    function csrfguard_inject()
    {
    $data=ob_get_clean();
    $data=csrfguard_replace_forms($data);
    echo $data;
    }
    function csrfguard_start()
    {
    if (count($_POST))
    {
    if ( !isset($_POST['CSRFName']) or !isset($_POST['CSRFToken']) )
    {
    trigger_error("No CSRFName found, probable invalid request.",E_USER_ERROR); 

    $name =$_POST['CSRFName'];
    $token=$_POST['CSRFToken'];
    if (!csrfguard_validate_token($name, $token))

    trigger_error("Invalid CSRF token.",E_USER_ERROR);
    }
    }
    ob_start();
    /* adding double quotes for "csrfguard_inject" to prevent: 
    Notice: Use of undefined constant csrfguard_inject - assumed 'csrfguard_inject' */
    register_shutdown_function("csrfguard_inject"); 
    }
    csrfguard_start(2881064151);

    前三个功能,是一个抽象的概念如何会话变量存储。如果你不使用PHP会话更换。生成功能,创建一个随机的安全一次性CSRF令牌。如果SHA512是可用的,它被使用,否则产生一个512位的随机字符串在同一格式。这个功能也将生成一个唯一的名称下的令牌在会话变量。验证功能,检查唯一名下的令牌。有三步:
    会话不主动:验证成功(没有CSRF风险)
    会话发现但不相同,或令牌不发现:验证失败
    会话发现相同:验证成功
    任何情况下,该函数删除会话令牌,确保一例
    替换功能,接收HTML数据的一部分,发现所有<form>事件并添加了两个隐藏域他们:csrfname和csrftoken。如果任何这些形式有一个属性或值nocsrf”,除了不会被执行(注意,使用默认的注入,这个检测时间)。
    其他两个函数,将开始是一个演示如何使用其他功能。使用输出缓冲对你的整个输出不推荐(有些图书馆可能转储输出缓冲)。这种默认行为,执行CSRF令牌所有形式使用POST方法。它是假定没有任何敏感的操作方法是在应用程序得到执行,由RFC 2616要求
    为了测试这些代码,添加以下HTML吧:
    <form method='post'>
    <input type='text' name='test' value='<?php echo "testing"?>' />
    <input type='submit' />
    </form>
    <form class='nocsrf'>
    </form>

  • 相关阅读:
    关于IDEA2019.3在书写pom依赖坐标无法自动提示补全的问题
    vue props的接收格式
    axios请求添加请求头 标准写法
    VUE后台管理系统建立
    arguments
    表单验证规则
    <<>> html内显示
    vue_UI组件库vant之加载转圈
    vue_axios请求拦截器
    vue_js数字有效长度16位_超出的解决办法
  • 原文地址:https://www.cnblogs.com/cbryge/p/6236096.html
Copyright © 2011-2022 走看看