MySQL と SQL インジェクション
Web ページを通じてユーザーが入力したデータを取得し、それを MySQL データベースに挿入すると、SQL インジェクションのセキュリティ問題が発生する可能性があります。
この章では、SQL インジェクションを防止し、スクリプトを使用して SQL にインジェクションされた文字をフィルターする方法を紹介します。
いわゆる SQL インジェクションとは、Web フォームの送信に SQL コマンドを挿入したり、ページ リクエストのドメイン名やクエリ文字列を入力したりして、最終的にサーバーをだまして悪意のある SQL コマンドを実行させることです。
ユーザー入力を決して信頼すべきではありません。ユーザーが入力したデータは安全ではないと想定する必要があります。
次の例では、入力したユーザー名は文字、数字、アンダースコアの組み合わせである必要があり、ユーザー名の長さは 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 変数をフィルターしませんでした。これにより、users テーブル内のすべてのデータが削除されます。 PHP の
Mysql_query() では複数の SQL ステートメントの実行は許可されていませんが、SQLite や PostgreSQL では複数の SQL ステートメントを同時に実行できるため、これらのユーザーのデータを厳密に検証する必要があります。
SQL インジェクションを防ぐには、次の点に注意する必要があります:
1. ユーザー入力を決して信頼しないでください。ユーザーの入力を検証するには、正規表現を使用するか、一重引用符や二重 "-" などを変換して長さを制限できます。
2. SQL の動的アセンブリを使用しないでください。データのクエリとアクセスには、パラメーター化された SQL を使用するか、ストアド プロシージャを直接使用できます。
3. 管理者権限を持つデータベース接続は決して使用せず、アプリケーションごとに権限が制限された別のデータベース接続を使用します。
v 4. 機密情報を直接保存せず、パスワードや機密情報を暗号化またはハッシュ化します。
5. アプリケーションの例外情報は、できるだけ少ないヒントを提供して、元のエラー メッセージをパッケージ化するのが最善です。
6. SQL インジェクションの検出方法は、通常、補助ソフトウェアまたは Web サイトのプラットフォームを使用して検出します。ソフトウェアは通常、SQL インジェクション検出ツール jsky を使用し、Web サイト プラットフォームには Yis Web サイト セキュリティ プラットフォーム検出ツールが含まれています。 MDCソフトスキャンなどMDCSOFT-IPS を使用すると、SQL インジェクション、XSS 攻撃などを効果的に防御できます。
SQL インジェクションの防止
Perl や PHP などのスクリプト言語では、ユーザーが入力したデータをエスケープして SQL インジェクションを防ぐことができます。
PHP の MySQL 拡張機能は、特殊な入力文字をエスケープするための mysql_real_escape_string() 関数を提供します。
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name='{$name}'");
Like ステートメントへのインジェクション
Like クエリを実行するとき、ユーザーが入力した値に「_」と「%」が含まれている場合、この状況が発生します。ユーザーは元々「abcd_」のみをクエリしたかったのに、クエリが結果に「abcd_」、「abcde」、「abcdf」などが含まれる場合、ユーザーが「30%」(注: 30%) をクエリしたい場合にも問題が発生します。
PHP スクリプトでは、次の例に示すように、addcslashes() 関数を使用して上記の状況を処理できます:
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'")
addcslashes() 関数は、指定された文字の前にバックスラッシュを追加します。
構文形式:
addcslashes(string,characters)
パラメータ
説明
文字列 必須。チェックする文字列を指定します。
文字 オプション。 addcslashes() の影響を受ける文字または文字の範囲を指定します。
特定のアプリケーションについては、以下を参照してください: PHP addcslashes() 関数
上記は、[mysql チュートリアル] MySQL と SQL インジェクションの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.ん)!