MySQLとSQLインジェクション
あなたがウェブを介してユーザが入力したデータを取得し、MySQLデータベースに挿入した場合、それは可能なSQLインジェクションのセキュリティ上の問題です。
このセクションでは、SQLインジェクションを防ぐ方法を教えてくれますし、スクリプト内のSQLインジェクション文字をフィルタリングします。
いわゆるSQLインジェクションは、悪質なSQLコマンドを実行するサーバーを欺く最終的に送信するか、ドメイン名またはページリクエストクエリ文字列を入力して、Webフォームに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}'");
注射ステートメントの上に、我々は、変数$名、私たちはテーブルのユーザーのすべてのデータが削除されたSQL文を挿入する必要はありません$名をフィルタリングする必要はありません。
PHP()内のmysql_queryは、複数のSQL文を実行するために許可されていないが、これらのデータのユーザーは、我々は厳格な検証を必要とするので、SQLiteのとPostgreSQLで、同時に複数のSQL文を実行することができます。
SQLインジェクションを防ぐため、我々は以下の点に注意を払う必要があります:
- 1.ユーザー入力を信用しないでください。 ユーザー入力の検証には、正規表現を使用、または長さを制限することができ、単一および二重引用符 " - "変換に。
- 2.あなたは、SQLを直接使用するパラメータやデータの照会アクセスのためのストアドプロシージャを使用することができ、動的アセンブリのSQLを使用しないでください。
- 3.各アプリケーションのデータベース接続に制限された個々の権限を使用し、管理者権限のデータベース接続を使用しないでください。
- 4.直接機密情報を格納し、暗号化やパスワードや機密情報をハッシュしないでください。
- 5.アプリケーションの例外情報がいくつかのプロンプトとして与えられるべきで、それはカスタムエラーメッセージエラーメッセージのオリジナル梱包材を使用するのが最適です
- 検出するための一般的またはサポートするソフトウェアプラットフォームで検出6.sql注射部位、ソフトウェア一般的に使用されるSQLインジェクション検出ツールjsky、インターネットサイトのホームページ億セキュリティプラットフォームの検出ツールがある思考。 MDCSOFT SCANが好きです。 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}'");
文の注射と同様に
ユーザーは、「_」の値と「%」を入力した場合、クエリのように、この処理が行われます。ユーザーは単にクエリ "abcd_」をしようとしていた、そこにクエリの結果が「ABCD _"、 "ABCDE"、 "ABCDF」など;「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()関数を