ホームページ  >  記事  >  バックエンド開発  >  PHP_PHPチュートリアルでSQLインジェクションを防ぐ具体的な方法を詳しく解説

PHP_PHPチュートリアルでSQLインジェクションを防ぐ具体的な方法を詳しく解説

WBOY
WBOYオリジナル
2016-07-15 13:32:32831ブラウズ

Web サイトのセキュリティに関して言えば、SQL インジェクションについて言及する必要があります。これは、以下のバージョンの PHP が比較的高いセキュリティを備えているためです。 MYSQL4 はサブステートメントをサポートせず、php.ini の magic_quotes_gpc が On の場合にサポートされません。 送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および null 文字はバックスラッシュを含むエスケープ文字に自動的に変換され、SQL インジェクションで多くの問題を引き起こします。

明確に確認してください:それは単に「面倒」です~ これは、PHP が SQL インジェクションを防止するという意味ではありません。この本では、SQL ステートメントを ASCII エンコーディングに変換するなど、インジェクトされたステートメントのエンコーディングを変更することでエスケープを回避する方法について説明しています。 58,92,108,111,99,97,108,104,111,115,116...) 形式)、または 16 進エンコーディング、または他の形式のエンコーディングに変換して、エスケープ フィルタリングをバイパスします。 addlashes() 関数を使用してください

新しいバージョンの PHP では、magic_quotes_gpc がオンになっていて addlashes() 関数が使用されても競合は発生しませんが、バージョンの互換性を高めるために、次のことをお勧めします。 transfer 関数を使用する前に、magic_quotes_gpc のステータスを確認するか、直接オフにします。 コードは次のとおりです:

SQL インジェクションを防ぐための PHP コード

<ol class="dp-xml">
<li class="alt"><span><span>// 去除转义字符   </span></span></li>
<li><span>function stripslashes_array($array) {   </span></li>
<li class="alt"><span>if (is_array($array)) {   </span></li>
<li>
<span>foreach ($array as $</span><span class="attribute">k</span><span> =</span><span class="tag">></span><span> $v) {   </span>
</li>
<li class="alt"><span>$array[$k] = stripslashes_array($v);   </span></li>
<li><span>}   </span></li>
<li class="alt"><span>} else if (is_string($array)) {   </span></li>
<li>
<span>$</span><span class="attribute">array</span><span> = </span><span class="attribute-value">stripslashes</span><span>($array);   </span>
</li>
<li class="alt"><span>}   </span></li>
<li><span>return $array;   </span></li>
<li class="alt"><span>}   </span></li>
<li><span>@set_magic_quotes_runtime(0);   </span></li>
<li class="alt"><span>// 判断 magic_quotes_gpc 状态   </span></li>
<li><span>if (@get_magic_quotes_gpc()) {   </span></li>
<li class="alt">
<span>$</span><span class="attribute">_GET</span><span> = </span><span class="attribute-value">stripslashes_array</span><span>($_GET);   </span>
</li>
<li>
<span>$</span><span class="attribute">_POST</span><span> = </span><span class="attribute-value">stripslashes_array</span><span>($_POST);   </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">_COOKIE</span><span> = </span><span class="attribute-value">stripslashes_array</span><span>($_COOKIE);   </span>
</li>
<li><span>}  </span></li>
</ol>
addslashes 関数を使用する前に、magic_quotes_gpc のエスケープを削除します。コードは次のとおりです。 SQL インジェクションを防ぐための PHP コード

$keywords = addlashes($keywords);

$keywords = str_replace("_","_",$keywords);//Escape "_"

$keywords = str_replace(" %","%",$keywords);//エスケープ "%"

最後の 2 つの str_replace 置換の目的は、ハッカーが攻撃のために SQL エンコーディングを変換するのを防ぐことです

b. 形式 (タイプ)



多くの場合、xxx.php?id=xxx のような URL を使用する必要があります。一般的に、$id は整数変数であり、攻撃者が $id を改ざんして攻撃ステートメントに組み込むのを防ぐために、最善を尽くす必要があります。

SQL インジェクションを防ぐための PHP コード

$id=intval($_GET['id']); もちろん、他の変数タイプもありますが、必要に応じてフォーマットを強制してみてください.

c. SQL ステートメントには引用符が含まれています

これは非常に簡単ですが、習慣を形成するのも簡単です:

SQL コード

SELECT * FROMarticle WHEREarticleid='$id' SELECT * FROMarticle WHEREarticleid=$id

どちらの書き方もさまざまなプログラムで共通ですが、セキュリティが異なります。最初の文は、変数 $id が a に配置されているためです。単一引用符のペア。これにより、送信する変数が文字列に変換されます。たとえ正しい SQL ステートメントが含まれていたとしても、2 番目の文は、すべてが単一引用符で囲まれていないため、通常とは異なります。スペースを含む変数を送信すると、スペース以降の変数が SQL ステートメントとして実行されるため、SQL ステートメント内の変数に引用符を追加する習慣を身に付ける必要があります。

d.URL pseudo-static

URL pseudo-static は、Discuz のような URL 書き換えテクノロジーです。同様に、すべての URL を xxx-xxx-x.html のような形式に書き換えることをお勧めします。これは SEO に有益であり、一定レベルのセキュリティを実現します。ただし、PHP で SQL インジェクションを防ぐには、特定の「通常の」基盤が必要であることが前提となります。


http://www.bkjia.com/PHPjc/446121.html

www.bkjia.com


tru​​e


http://www.bkjia.com/PHPjc/446121.html

技術記事

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。