PHPユーザー入力安全フィルタリングと注入攻撃検出

19346 ワード

ThinkPHPより抜粋
/**
 *              
 * @param array         $data    
 * @param string|false  $name    
 * @param mixed         $default    
 * @param string|array  $filter     
 * @return mixed
 */
function input($data = [], $name = '', $default = null, $filter = '')
{
    $name = (string) $name;

    if (is_array($data)) {
        array_walk_recursive($data, 'filterValue', $filter);
        reset($data);
    } else {
        filterValue($data, $name, $filter);
    }
    return $data;
}


/**
 *         
 * @param mixed     $value   
 * @param mixed     $key   
 * @param array     $filters     +   
 * @return mixed
 */
function filterValue(&$value, $key, $filters)
{
    $default = array_pop($filters);
    foreach ($filters as $filter) {
        if (is_callable($filter)) {
            //           
            $value = call_user_func($filter, $value);
        } elseif (is_scalar($value)) {
            if (false !== strpos($filter, '/')) {
                //     
                if (!preg_match($filter, $value)) {
                    //           
                    $value = $default;
                    break;
                }
            } elseif (!empty($filter)) {
                // filter      ,    filter_var    
                // filter      ,   filter_id    id
                $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));
                if (false === $value) {
                    $value = $default;
                    break;
                }
            }
        }
    }
    return filterExp($value);
}

/**
 *          
 * @param string $value
 * @return void
 */
function filterExp(&$value)
{
    //         
    if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) {
        $value .= ' ';
    }
    // TODO       
}

/**
 *       
 * @param string $data
 * @param string $type
 * @return mixed
 */
function typeCast(&$data, $type)
{
    switch (strtolower($type)) {
        //   
        case 'a':
            $data = (array) $data;
            break;
        //   
        case 'd':
            $data = (int) $data;
            break;
        //   
        case 'f':
            $data = (float) $data;
            break;
        //   
        case 'b':
            $data = (boolean) $data;
            break;
        //    
        case 's':
        default:
            if (is_scalar($data)) {
                $data = (string) $data;
            } else {
                throw new InvalidArgumentException('variable type error:' . gettype($data));
            }
    }
}

PHP検出SQL注入攻撃コード
//    
function filter_injection(&$request)
{
    $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])|(truncate[\s])|(drop[\s])|(table[\s])|(grant[\s])|(load_file[\s])|(outfile[\s])/i";
    foreach($request as $k=>$v)
    {
        if(preg_match($pattern,$k,$match))
        {
            die("SQL Injection denied!");
        }

        if(is_array($v))
        {
            filter_injection($request[$k]);
        }
        else
        {
            if(preg_match($pattern,$v,$match))
            {
                die("SQL Injection denied!");
            }
        }
    }
}
JavaScript  SQL       :

<span style="color:#0000ff;">var</span> url =<span style="color:#000000;"> location.search;
</span><span style="color:#0000ff;">var</span> re=/^\?(.*)(select%20|insert%20|delete%20from%20|drop%20table|update%20truncate%20)(.*)$/<span style="color:#000000;">gi;
</span><span style="color:#0000ff;">var</span> e =<span style="color:#000000;"> re.test(url);
</span><span style="color:#0000ff;">if</span><span style="color:#000000;">(e) {
    alert(</span>"         ~"<span style="color:#000000;">);
}
</span><script></pre> 
   </div> 
   <p> </p> 
   <table border="0"> 
    <tbody> 
     <tr> 
      <td> <p style="text-align:left;line-height:30px;">    :      -      -      (CC BY-NC-SA 3.0 CN)          ,          。<br>    :PHP               <br>    :http://www.cnblogs.com/sochishun/p/8459562.html<br>    :SoChishun (  :14507247#qq.com |   :http://www.cnblogs.com/sochishun/)<br>    :2018 2 22 </p> </td> 
     </tr> 
    </tbody> 
   </table> 
  </div> 
  <p>   :https://www.cnblogs.com/sochishun/p/8459562.html</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC WAP    -->
                    <div id="SOHUCS" sid="1291780102765486080"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js">
                    
                     
                
興味があるかもしれません
  • JAvaファクトリモード
    3213213333332132
    java ちゅうしょうこうじょう
  • nginx周波数制限+pythonテスト
    ronin47
    nginx周波数python
  • JAvaスレッドとスレッドプールの使用
    dyy_gusi
    ThreadPool thread Runnable timer
  • Linux
    171815164
    linux
  • Tomcat JDBC Connection Pool
    g21121
    Connection
  • コードを叩く少しの考え
    永夜-オーロラ
    java エッセイ 感想
  • jvm命令セット
    プログラマーはどうやって作ったの?
    jvm命令セット
  • Oracle文字セットの表示クエリーとOracle文字セットの設定変更
    aijuans
    oracle
  • アルファベットで分類:
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z その他
    トップページ -
    私たちについて -
    構内検索 -
    Sitemap -
    権利侵害苦情
    著作権すべてのIT知識ベースCopyRight© 2000-2050 IT知識ベースIT 610.com , All Rights Reserved.
    京ICP備09083238号