優れた PHP プログラマーは、コードをスムーズに記述できることに加えて、プログラムを安全な環境に保管する能力も必要です。今回はPHPでSQLインジェクションを防ぐ方法を説明します。
Web サイトのセキュリティに関しては、SQL インジェクションについて言及する必要があります。ASP を使用したことがある場合、PHP は比較的高いセキュリティを備えている必要があります。これは、MYSQL4 より前のバージョンでは SQL インジェクションがサポートされていないためです。 php.ini の magic_quotes_gpc が On の場合。
送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および null 文字はバックスラッシュを含むエスケープ文字に自動的に変換され、SQL インジェクションに多大な問題を引き起こします。
明確に見てください: それは単に「面倒」です~ これは、PHP が SQL インジェクションを防止するという意味ではありません。この本では、SQL ステートメントを ASCII エンコーディングに変換するなど、インジェクトされたステートメントのエンコーディングを変更することでエスケープを回避する方法について説明しています。 char (100,58,92,108,111,99,97,108,104,111,115,116...))、または 16 進エンコーディング、または他の形式のエンコーディングに変換されると、エスケープ フィルタリングがバイパスされます。 あ。 magic_quotes_gpc を開くか、addslashes() 関数を使用しますPHP の新しいバージョンでは、magic_quotes_gpc がオンになっている場合でも、addslashes() 関数を使用するときに競合は発生しません。ただし、バージョンの互換性を高めるために、転送を使用する前に magic_quotes_gpc のステータスを確認することをお勧めします。関数を使用するか、直接オフにする場合、コードは次のとおりです:
SQL インジェクションを防ぐための PHP コード
$keywords = addlashes($keywords);
$keywords = str_replace("_","_",$keywords);//Escape "_ "$keywords = str_replace("%","%",$keywords);//エスケープ "%"
$id=intval($_GET['id']);
もちろん、他の変数タイプもあります。必要に応じて、フォーマットを強制してみてください。
c。 SQL ステートメントには引用符付きの変数が含まれていますこれは非常にシンプルですが、習慣を形成するのも簡単です。まず、次の 2 つの SQL ステートメントを見てみましょう。
SQLコード
コードをコピー コードは次のとおりです:
SELECT * FROM Article WHEREarticleid='$id'SELECT * FROM Article WHEREarticleid=$id
どちらの記述方法もさまざまなプログラムで共通ですが、セキュリティが異なります。最初の文では変数 $id を一重引用符で囲んでいるため、正しい SQL ステートメントが含まれている場合でも、送信する変数は文字列になります。 2 番目の文は異なります。変数は一重引用符で囲まれていないため、スペースが含まれている限りすべて SQL ステートメントとして扱われます。そのため、変数に引用符を付ける習慣を身に付ける必要があります。 SQL ステートメントで。
d.URL 擬似静的
URL 擬似静的とは、Discuz のような URL 書き換えテクノロジーです。同様に、すべての URL を xxx-xxx-x.html のような形式に書き換えることをお勧めします。これは SEO に有益であり、一定レベルのセキュリティを実現します。ただし、PHP で SQL インジェクションを防ぐには、特定の「通常の」基盤が必要であることが前提となります。