ホームページ  >  記事  >  バックエンド開発  >  PHP での SQL インジェクションのいくつかの方法を理解する Yourself_PHP チュートリアル

PHP での SQL インジェクションのいくつかの方法を理解する Yourself_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:10:311114ブラウズ

PHP での SQL インジェクションのいくつかの方法を理解します。以下に示すのは最も一般的な SQL インジェクションの方法です。必要な場合は参照してください。

注射とは何ですか?

たとえば、データベースにクエリを実行すると、記事の ID 番号を通じてこの記事のすべての情報が取得されます。次に、SQL ステートメントは次のように記述できます:

コードは次のとおりです コードをコピー

ID=5のブログから*を選択

id の値は、ユーザーの操作を通じて (通常は GET メソッドで) read.php?id=5 の形式で渡されます。これには問題がないようですが、SQL ステートメントを少し変更すると、次のようになります。

コードは次のとおりですコードをコピー
ID=5 または 1=1 のブログから * を選択してください

1=1 は同じなので、このステートメントはすべての記事を取得します。これを変更するには、GET によって渡される値を変更するだけです: read.php?id='5 または 1=1'; これら 2 つの一重引用符に注意してください... したがって、最も簡単なことは、パラメータを一重引用符に設定して、このリンクが挿入されているかどうかを確認します。もちろん、違法ユーザーがすべての記事を見ても問題ありませんが、このテーブルにアカウント番号とパスワードが保存されている場合はどうなるでしょうか?

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 は、復帰と改行を
に変換します。これは、ユーザーがコメントなどの情報を入力するときによく使用されます。

上記の関数を通じて、いくつかの単純なインジェクションをフィルターすることができます。さらに、いくつかの小さな側面についてもお話しましょう:

最初の例については、実際には改善の余地がたくさんあります。たとえば、次のように記述すると、より標準化されたように見えるはずです。

コードは次のとおりですコードをコピー
SELECT * FROM `blog` WHERE `id`='$id'

SQL キーワードには大文字を使用し、データベース内のテーブルとフィールドには小文字を使用します。さらに、フィールド名とテーブル名 (数字の左側のキー) に「・」記号を追加します。キーボードの 1)、受信 ID を一重引用符で囲みます。

このような数値型の受信パラメータの場合、$_GET で取得した値を強制的に変換できます。しかし、私はこれに慣れています:

コードは次のとおりですコードをコピー
$id = $_GET['id']*1; //記事のIDを取得して記事情報を表示します

if($id == 0){

「エラー...」をエコーし​​ます

;

終了()

}

渡された数値が数値ではないことが判明した場合は、パラメーターに問題がある可能性が非常に高いため、不正なデータベース クエリ操作を実行しないように、エラー メッセージを直接表示して終了することができます。ユーザー。

最後に、JBlog でインジェクションを処理する場所を見てみましょう:

common.phpの38行目を含める

コードは次のとおりですコードをコピー
if ( !get_magic_quotes_gpc() ) {

$_GET = add_slashes($_GET);

$_POST = add_slashes($_POST);

$_COOKIE = add_slashes($_COOKIE);

}

includefunc_global.php 行 194

コードは次のとおりです コードをコピー

//スラッシュを追加します

関数 add_slashes($string) {

if (!is_array($string)) はaddslashes($string)を返します

foreach ($string as $key => $val) {

$string[$key] = add_slashes($val);

}

$string を返す

}


もちろん、これはほんの一部であり、残りも同様であるはずです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629655.html技術記事 php での SQL インジェクションのいくつかの方法を理解します。以下に示すのは、最も一般的な SQL インジェクションの方法です。必要な方は参照してください。 注射とは何ですか? たとえば、データをクエリしています...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。