MySQL と SQL インジェクション
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. 管理者権限を持つデータベース接続は決して使用せず、アプリケーションごとに権限が制限された別のデータベース接続を使用してください。
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() 関数を提供します。
Like ステートメントでのインジェクション
Like クエリを実行するときに、ユーザーが入力した値に「_」と「%」が含まれている場合、この状況が発生します。ユーザーは元々「abcd_」のみをクエリしたかったのに、「abcd_」が存在します。クエリ結果の「abcde」、「abcdf」など。ユーザーが「30%」(注: 30%) をクエリしたい場合にも問題が発生します。
PHP スクリプトでは、次の例に示すように、addcslashes() 関数を使用して上記の状況を処理できます:
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name='{$name}'")addcslashes() 関数は、指定された文字の前にバックスラッシュを追加します。
文法形式:
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
パラメータ | 説明 |
---|---|
文字列 | 必須。チェックする文字列を指定します。 |
文字 | はオプションです。 addcslashes() の影響を受ける文字または文字の範囲を指定します。 |
おすすめの関連ビデオチュートリアル: mysql チュートリアル