PHPにおけるSQL注入防止実装コード

3804 ワード

ウェブサイトの安全といえばSQL注入(SQL Injection)と言わざるを得ません.ASPを使ったことがある場合は、SQL注入について深く理解しているに違いありません.PHPの安全性は比較的高いです.これは、MYSQL 4以下のバージョンではサブ文がサポートされておらず、phpになっているからです.iniの中のmagic_quotes_gpcがOnの場合.
コミットされた変数のすべての'(単一引用符)、"(二重引用符)、(反斜線)and空の文字は自動的に反斜線を含むエスケープ文字に変換され、SQL注入に多くの面倒をもたらす.
「面倒くさい」ということをよく見てください.PHPがSQL注入を防ぐという意味ではありません.本では、SQL文をASCII符号化(char(100,58,9210811,99,9710411111151116...)に変換するなど、注入文の符号化を変更してエスケープを迂回する方法について説明しています.、あるいは16進数符号化に移行したり、他の形式の符号化に移行したりして、それ以来、エスケープフィルタリングは迂回されています.では、どのように防ぐのでしょうか.
 
a.magic_quotes_gpcを開くかaddslashes()関数を使う
 
新バージョンのPHPでは、magic_quotes_gpcが開いていてもaddslashes()関数を使用しても競合はありませんが、バージョン互換性をよりよく実現するためには、移行関数を使用する前にmagic_quotes_gpcの状態を検出するか、直接オフにすることをお勧めします.コードは以下の通りです.
PHP SQL注入防止コード
  • //エスケープ文字を削除
  • function stripslashes_array($array) {   
  • if (is_array($array)) {   
  • foreach ($array as $k => $v) {   
  • $array[$k] = stripslashes_array($v);   
  • }   
  • } else if (is_string($array)) {   
  • $array = stripslashes($array);   
  • }   
  • return $array;   
  • }   
  • @set_magic_quotes_runtime(0);   
  • //判断magic_quotes_gpc状態
  • if (@get_magic_quotes_gpc()) {   
  • $_GET = stripslashes_array($_GET);   
  • $_POST = stripslashes_array($_POST);   
  • $_COOKIE = stripslashes_array($_COOKIE);   
  • }  

  • magic_quotes_gpcのエスケープを除去した後、addslashes関数を使用します.コードは次のとおりです.
    PHP SQL注入防止コード
    $keywords=addslashes($keywords);$keywords=str_replace("","",$keywords);//エスケープダウン""$keywords=str_replace("%","%",$keywords);//エスケープダウン"%"
    次の2つのstr_replace置換エスケープの目的は、SQL符号化をハッカーが変換して攻撃することを防止することである.
     
    b.強制文字フォーマット(タイプ)
     
    多くの場合、xxx.php?id=xxxのようなURLを使用します.一般的に$idは整数変数です.攻撃者が$idを攻撃文に改ざんするのを防ぐために、できるだけ変数を強制します.コードは以下の通りです.
    PHP SQL注入防止コード
    $id=intval($_GET[‘id’]);
    もちろん、他の変数タイプもありますが、必要ならできるだけフォーマットを強制してください.
     
    c.SQL文に変数を引用符で囲む
     
    この点は簡単ですが、習慣を身につけやすいので、まずこの2つのSQL文を見てみましょう.
    SQLコード
    SELECT * FROM article WHERE articleid='$id'  SELECT * FROM article WHERE articleid=$id
    2つの書き方は、さまざまなプログラムで一般的ですが、セキュリティは異なります.最初の文は変数$idを1対の単一引用符に置くため、私たちが提出した変数が文字列になり、正しいSQL文が含まれていても正常に実行されません.2番目の文は異なり、変数を単一引用符に入れていないため、私たちが提出したすべては、パッケージスペースを含めると、そのスペースの変数はSQL文として実行されるので、SQL文の変数に引用符を付ける習慣を身につけなければなりません.
    d.URL擬似静態化
    URL擬似静的化すなわちURL書き換え技術は、Discuz!のように、すべてのURLをxxx-xxx-x.html形式にrewriteし、SEOにも有利であり、一定の安全性を達成し、良い方法でもある.しかし、PHPを実現するにはSQL注入を防ぐには、一定の「正則」の基礎が必要であることが前提である.
     
    <1>addslashesで指定した事前定義文字列(一重引用符(')、二重引用符(')、反斜線()、NUL)の前に反スラッシュを付ける
    addslashes()を使用する例は、データベースにデータを入力する場合です.たとえば、データベースに名前O'reillyを挿入すると、
    これはそれをエスケープする必要がある.ほとんどのデータベースでは、をエスケープ文字として使用しています:O'reilly.
    これにより、追加のを挿入せずにデータベースにデータを格納できます.
    PHP指令magic_quotes_Sybaseがonに設定されている場合、'を挿入すると'を使用してエスケープされることを意味します. 
    デフォルトでは、PHP命令magic_quotes_gpcはonであり、
    主にすべてのGET、POST、COOKIEデータに対してaddslashes()を自動的に実行します.
    もうmagic_にquotes_gpc転送された文字列はaddslashes()を使用し、
    これは二重転義を招くからだ.この場合、関数get_を使用できます.magic_quotes_gpc()で検出します.
    function addslashes_deep($value) 
    {
        if (empty($value)) 
    {
    return$value;//空の場合、直接戻ります.
        } 
    else 
    {
    //すべての配列要素を遍歴するまで配列を再帰的に処理する.
            return is_array($value) ? array_map('addslashes_deep', $value): addslashes($value);
        }  
    }
    <2>set_magic_quotes_runtime
    "'という文字がデータベースに書き込まれ、フィルタリングされないようにしたいとき
    set_magic_quotes_runtimeは、PHP環境構成を設定する変数magic_quotes_runtimeの値です.0-オフ1-オン
    get_magic_quotes_runtime、0を返して本機能を閉じる;1を返して本機能が開く
    <3>mysql_escape_string addslashesに類似