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>

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/cbryge/p/6236096.html
Copyright © 2011-2022 走看看