この記事では主にMySQLとSQLインジェクションとその防止方法について詳しく紹介します。非常に優れた参考値がありますので、必要に応じて参照してください。
いわゆる SQL インジェクションとは、Web フォームの送信に SQL コマンドを挿入したり、ドメイン名やページ リクエストのクエリ文字列を入力したりして、最終的にサーバーを騙すことです。悪意のある SQL コマンドの実行に関与します。
ユーザー入力を決して信頼してはなりません。ユーザーが入力したデータは安全ではないと判断する必要があります。
1. 次の例では、入力するユーザー名は文字、数字、アンダースコアの組み合わせであり、ユーザー名の長さは 8 ~ 20 文字である必要があります:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
特殊文字がフィルタリングされていないときに発生する SQL の状況を見てみましょう:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysql_query("SELECT * FROM users WHERE name='{$name}'");
上記の注入ステートメントでは、$name 変数をフィルターしませんでした。$name に不要な SQL ステートメントが挿入されました。これにより、users テーブル内のすべてのデータが削除されます。
2. PHP の Mysql_query() では複数の SQL ステートメントを実行できませんが、SQLite と PostgreSQL では複数の SQL ステートメントを同時に実行できるため、これらのユーザーのデータを厳密に検証する必要があります。
SQL インジェクションを防ぐには、次の点に注意する必要があります:
1. ユーザー入力を決して信用しないでください。ユーザーの入力を検証するには、正規表現を使用するか、一重引用符や二重 "-" などを変換して長さを制限できます。
2. SQL の動的アセンブリは決して使用しないでください。データのクエリとアクセスには、パラメーター化された SQL を使用するか、ストアド プロシージャを直接使用できます。
3. 管理者権限を持つデータベース接続は決して使用しないでください。アプリケーションごとに権限が制限された別のデータベース接続を使用してください。
4. 機密情報を直接保存しないでください。パスワードや機密情報は暗号化またはハッシュ化してください。
5. アプリケーションの例外情報は、できる限り少ないヒントを提供する必要があり、カスタム エラー情報を使用して元のエラー情報をラップすることが最善です
。
6. SQL インジェクション検出方法は、通常、補助ソフトウェアまたは Web サイト プラットフォームを使用して検出します。ソフトウェアは通常、SQL インジェクション検出ツール jsky を使用し、Web サイト プラットフォームには Yisi Web サイト セキュリティ プラットフォーム検出ツールがあります。 MDCソフトスキャンなどMDCSOFT-IPS を使用すると、SQL インジェクション、XSS 攻撃などを効果的に防御できます。
3. SQL インジェクションを防ぐ
Perl や PHP などのスクリプト言語では、ユーザーが入力したデータをエスケープして SQL インジェクションを防ぐことができます。
PHP の MySQL 拡張機能は、特殊な入力文字をエスケープするための mysql_real_escape_string() 関数を提供します。
りー4.Likeステートメントへのインジェクション
次のようなクエリを実行するときに、ユーザーが入力した値に「_」と「%」が含まれている場合、この状況が発生します。ユーザーは当初「abcd_」のみをクエリしたかったのに、クエリ結果には「abcd_」、「abcde」が含まれます。 、および「abcdf」待機します。ユーザーが「30%」(注: 30 パーセント) をクエリしたい場合にも問題が発生します。
次の例に示すように、PHP スクリプトでは addcslashes() 関数を使用して上記の状況を処理できます。 addcslashes() 関数は、指定された文字の前にバックスラッシュを追加します。
文法形式:
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name='{$name}'");
パラメータの説明
文字列は必須です。チェックする文字列を指定します。
文字はオプションです。 addcslashes() の影響を受ける文字または文字の範囲を指定します。
以上がMySQL と SQL インジェクションおよび防止方法の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。