ホームページ > バックエンド開発 > PHPチュートリアル > PHPでSQLインジェクションを防ぐ方法とサンプルコード

PHPでSQLインジェクションを防ぐ方法とサンプルコード

WBOY
リリース: 2016-07-25 09:12:16
オリジナル
1245 人が閲覧しました

PHP による SQL インジェクションの防止は、非常に重要なセキュリティ方法です。

優れた PHP プログラマーは、コードをスムーズに記述できることに加えて、プログラムを安全な環境に保管する能力も必要です。今回はPHPでSQLインジェクションを防ぐ方法を説明します。 Web サイトのセキュリティに関しては、SQL インジェクションについて言及する必要があります。ASP を使用したことがある場合は、SQL インジェクションについて深く理解しておく必要があります。これは、mysql4 より前のバージョンではサブタイトル ステートメントがサポートされていないためです。 、およびphp.iniのmagic_quotes_gpcがオンの場合。

送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ) および null 文字は、バックスラッシュを含むエスケープ文字に自動的に変換され、SQL インジェクションで多くの問題を引き起こします。 はっきりと見てください: これは単なる「トラブル」です ~ これは、PHP が SQL インジェクションを防止するという意味ではありません。この本では、SQL ステートメントを ASCII エンコーディングに変換するなど、エスケープをバイパスするためにインジェクション ステートメントのエンコーディングを変更する方法について説明しています。 char (100,58,92,108,111,99,97,108,104,111,115,116...) 形式)、または 16 進エンコーディング、または他の形式のエンコーディングに変換されると、エスケープ フィルターがバイパスされるため、それを防ぐ方法は次のとおりです。

a. magic_quotes_gpc を開くか、addslashes() 関数を使用します 新しいバージョンの PHP では、magic_quotes_gpc がオンになっている場合でも、addslashes() 関数を使用するときに競合は発生しません。ただし、バージョンの互換性をより高めるために、転送関数を使用する前に magic_quotes_gpc のステータスを確認することをお勧めします。 、または以下のようにコードを直接オフにします。 SQLインジェクションを防ぐPHPコード

  1. //エスケープ文字を削除
  2. functiontripslashes_array($array) {
  3. if (is_array($array)) {
  4. foreach ($array as $k => $v) {
  5. $array[$ k ] = ストリップスラッシュ($v);
  6. }
  7. } else if (is_string($array)) {
  8. $array = ストリップスラッシュ($array);
  9. @set_magic_quotes_runtime(0); / magic_quotes_gpc のステータスを決定する
  10. if (@get_magic_quotes_gpc()) {
  11. $_get =tripslashes_array($_post);
  12. $_cookie =tripslashes_array($_cookie);
  13. コピーコード
  14. magic_quotes_gpc のエスケープを削除して、addslashes 関数を使用します。 コードは次のとおりです。 SQLインジェクションを防ぐPHPコード
$keywords = addlashes($keywords); $keywords = str_replace("_","_",$keywords);//エスケープ "_" $keywords = str_replace("%" ," %",$keywords);//Escape "%"

コードをコピー
  1. 最後の 2 つの str_replace 置換エスケープの目的は、ハッカーが攻撃のために SQL エンコーディングを変換するのを防ぐことです。
  2. b. 強制文字フォーマット (タイプ) 多くの場合、xxx.php?id=xxx のような URL を使用する必要があります。一般に、$id は整数変数であり、攻撃者が $id を攻撃ステートメントに改ざんするのを防ぐために、変数を強制的に使用する必要があります。以下のとおりであります : SQLインジェクションを防ぐPHPコード
  3. $id=intval($_get['id']);
  4. もちろん、他の変数タイプもあります。必要に応じてフォーマットを強制してみてください。
c. SQL ステートメントには引用符で囲まれた変数が含まれています これは非常にシンプルですが、習慣を形成するのも簡単です。まず、次の 2 つの SQL ステートメントを見てみましょう。

select*fromarticlewherearticleid='$id' select*fromarticle wherearticleid=$id

コードをコピー

どちらの書き方も様々なプログラムで一般的ですが、安全ではありません最初の文は変数 $id を一重引用符で囲んでいるため、送信した変数が文字列に変換されますが、正しい SQL ステートメントが含まれている場合でも、2 番目の文は実行されません。通常、この 2 つの文は異なります。変数は一重引用符で囲まれていないため、送信するすべてにスペースが含まれている限り、スペースの後の変数が SQL ステートメントとして実行されます。そのため、引用符を追加する習慣を身に付ける必要があります。 SQL ステートメント内の変数。
  1. d.url 擬似静的 URL 擬似静的とは、discuz! のような URL 書き換え技術です。同様に、すべての URL を xxx-xxx-x.html のような形式に書き換えることをお勧めします。これは SEO に有益であり、一定レベルのセキュリティを実現します。ただし、PHP での SQL インジェクションを防止したい場合は、特定の「通常の」基盤が必要です。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート