SQLインジェクションと予防方法

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_42154707/article/details/88734643

はじめに:いわゆるSQLインジェクションは、SQLコマンドが提出したり、悪質なSQLコマンドを実行するサーバーを欺く最終的にドメイン名またはページリクエストクエリ文字列を入力して、Webフォームに挿入されています。

まず第一に考えを持っています:

  •     ユーザー入力を信用しないでください。正規表現により、ユーザの入力を確認するために、又は長さを制限するために、単一および二重引用符「 - 」変換のため。
  •     あなたは直接パラメータ化されたSQLを使用するか、またはデータ照会アクセスのためのストアドプロシージャを使用することができ、動的アセンブリのSQLを使用しないでください。
  •     個々のアプリケーションのデータベース上の制限された権限で接続し、データベース管理者権限を使用しないでください。
  •     機密情報が直接格納入れ、暗号化やパスワードや機密情報をハッシュしないでください。
  •     アプリケーション例外情報がいくつかのプロンプトとして与えられるべきで、それは元の包装のエラーメッセージにカスタムエラーメッセージを使用するのが最適です
  •     一般的な、検出するためのソフトウェアやWebプラットフォームをサポートする、一般的に使用されるソフトウェアのSQLインジェクション検出ツールjskyにおけるSQLインジェクション検出方法、Webプラットフォーム、そこ億サイトのセキュリティ検出プラットフォームツールの思考。MDCSOFT SCANのように。MDCSOFT-IPS効果的な防衛SQLインジェクション、XSS攻撃を使います。

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にフィルタリングがないときの状況を見てみましょう:

//セット$名、私たちは、SQLステートメントを挿入する必要はありません。

$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");

注射声明の上に、我々は、SQL文を挿入する必要はありません、$名を変数$名フィルタリングを持っていなかったすべてのデータのユーザーテーブルを削除します。

PHPのするmysql_query()2.複数のSQL文を実行するために許可されていませんが、これらのデータのユーザーは、私たちは厳格な検証する必要があるので、SQLiteのとPostgreSQLで、同時に複数のSQL文を実行することができます。

3. 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}'");

 

4.Like文のインジェクション

ユーザーが値「_」と「%」を入力した場合、クエリのように、これは起こる:ユーザーがちょうどクエリをしようとしていた「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で規定()文字の文字または範囲に影響を与えます。

推奨事項:再びデータの制限を受けた際に、一般的なユーザーの入力フロントエンド入力ページは、通常の試合の限界と、その背景には、多くの問題になります質問の変更のうち、手間を取ることはありません!

おすすめ

転載: blog.csdn.net/qq_42154707/article/details/88734643