ホームページ  >  記事  >  データベース  >  MySQL と SQL インジェクションおよび防止方法の詳細な紹介

MySQL と SQL インジェクションおよび防止方法の詳細な紹介

黄舟
黄舟オリジナル
2017-03-09 11:08:461162ブラウズ

この記事では主に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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。