PHP での SQL インジェクションのいくつかの方法を理解します。以下に示すのは最も一般的な SQL インジェクションの方法です。必要な場合は参照してください。
注射とは何ですか?
たとえば、データベースにクエリを実行すると、記事の ID 番号を通じてこの記事のすべての情報が取得されます。次に、SQL ステートメントは次のように記述できます:
コードは次のとおりです | コードをコピー |
ID=5のブログから*を選択 |
id の値は、ユーザーの操作を通じて (通常は GET メソッドで) read.php?id=5 の形式で渡されます。これには問題がないようですが、SQL ステートメントを少し変更すると、次のようになります。
コードをコピー | |
ID=5 または 1=1 のブログから * を選択してください
|
2. 注射を防ぐには?
最終的には、インジェクションを防ぐ根本は文字フィルタリングにあります。通常、不正なユーザーは URL を構築して値を渡します。不正なパラメータをフィルタリングすると、不正な SQL ステートメントは実行されなくなります。 Web サイトへの挿入も防ぎます。
PHP の組み込みフィルター文字列は非常に優れています。最初に具体的なコードを見てみましょう:
コードをコピー | |||||||||||||||||
機能安全($s) { if(!get_magic_quotes_gpc())
if(is_array($s)) foreach($s as $key=>$value) $s[$key] =addslashes($value); その他$s=addslashes($s); } $s を返す }
関数 html_safe($s) { nl2br(htmlspecialchars(safe($s) )) を返す }
上記で使用されている組み込み関数が分からず、マニュアルを確認するのが面倒な場合は、これらの関数について説明します: magic_quotes_gpc はマジック クォートと呼ばれます。この関数がオンになっている場合、データベースにデータを挿入するときに、マジック クォートはすべての GET、POST、および COOKIE データに addslashes() 関数を自動的に適用します。 get_magic_quotes_gpc() は、この関数がサーバー上でオンになっているかどうかを取得するために使用されます。オンになっている場合は、データが直接返され、オンになっていない場合は、パラメータが addslashes() で手動でエスケープされます。これで二重層エスケープを防ぐことができます~ addslashes -- バックスラッシュを使用して文字列を引用します。説明: string addedslashes (string str); データベースクエリステートメントなどの特定の文字の前にバックスラッシュを追加した文字列を返します。これらの文字は、一重引用符 (')、二重引用符 (")、バックスラッシュ ()、および NUL (NULL 文字) です。addslashes() の使用例は、データベースにデータを入力する場合です。たとえば、名前 O ' を変更する場合などです。 reilly はデータベースに挿入されますが、これにはエスケープ文字が必要です。ほとんどのデータベースでは、O'reilly をエスケープ文字として使用します。これにより、PHP ディレクティブが有効になっている場合、余分な文字を挿入せずにデータをデータベースに挿入できます。その ' は ' を挿入するときにエスケープされます。以下の htmlspecialchars は、「&」を「&」に変換したり、「<」を「<」に変換したりするなど、HTML 内の文字を変換します。 nl2br は、復帰と改行を 上記の関数を通じて、いくつかの単純なインジェクションをフィルターすることができます。さらに、いくつかの小さな側面についてもお話しましょう: 最初の例については、実際には改善の余地がたくさんあります。たとえば、次のように記述すると、より標準化されたように見えるはずです。
このような数値型の受信パラメータの場合、$_GET で取得した値を強制的に変換できます。しかし、私はこれに慣れています:
最後に、JBlog でインジェクションを処理する場所を見てみましょう: common.phpの38行目を含める
|