私のウェブサイトはSQLインジェクション攻撃を受けています。ハッカーがURLクエリ文字列で次のように使用しました。ユニオンとload_file()を使用したSQLインジェクション
abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
これらの攻撃を回避するにはどうすればよいですか?
私のウェブサイトはSQLインジェクション攻撃を受けています。ハッカーがURLクエリ文字列で次のように使用しました。ユニオンとload_file()を使用したSQLインジェクション
abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
これらの攻撃を回避するにはどうすればよいですか?
zend frameworkを使用してください。デフォルトではそれを防ぐことができます。 http://framework.zend.com/
またはエスケープするデータベースに入れるすべてのもの。
http://php.net/manual/en/function.mysql-real-escape-string.php
入力が何であるかに依存しますが、この場合には、それが-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
がOP(何でもOPである)の有効な入力ではないことを、おそらくかなり明白です。
この場合、「op」の値が期待値の1つと一致するかどうかをチェックするコードを追加するだけで簡単です。
if (op != "or" and op != "and" and op != "monkeys") {
raise_exception("Invalid op specified! Go away you trickster!");
}
あなたはのためにあなたがユーザーから受け取るすべての値をこの操作を行う必要があります。電子メールアドレスやコメントなど自由形式のフィールドでは扱いにくいですが、一致するフィールドの有効なデータであることを確認してから、フリーフォームフィールドをエスケープしてからデータベースに挿入してください。あなたは単に、
INSERT INTO users(username,fullname) VALUES ("bob",Robert\"\)\; DROP TABLE users\; SELECT 1 WHERE \"x\"=\"");
その最初の(非エスケープ)バージョン、DROP TABLE users;
コマンドの実行、および第二としている機能的な違い:
INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"="");
と:それは違いを作ることができます本当に長く、愚かな名前のRobert"); DROP TABLE users; SELECT 1 WHERE "x"="
を持つ新しいユーザーを挿入してください。
PDOに切り替えて、すべてのプレースホルダ付きの準備文を使用します。
ほとんどの回答では、データベースに保存するすべてのもの(フィールドプレースホルダ)をエスケープする必要があります。
しかし、私は最近、それなしので、あなたは、あなたのクエリ内のすべてのプレースホルダをエスケープする必要があることを発見した:「FROM句」の
プレースホルダは、ハッカーが任意のテーブルのデータにアクセスする可能性があります。
"WHERE句"のプレースホルダを使用すると、ハッカーは現在のテーブルのどの行にもアクセスできます。これは、ハッカーがログインしようとしたときにデータベースのユーザーとしてあなたのアプリケーションにアクセスする可能性があることを意味します。
+1いくつかのジョークでPDOやフレームワーク全体を推奨しません。 PDOには大きなメリットがありますが、それを使用せずに行うことができます。フレームワークも機能しますが、OPがこの目的のためにしか使用していない場合は、少し浪費します。標準のエスケープトリックに固執するだけです。 – Bojangles
準備されたステートメント(PDOなど)を使用するのはうまくいきますが、良い習慣ですが、あなたの入力を検証しないという言い訳ではありません!あなたの入力を検証せずに、適切に設計されたスキーマを持っていて入力検証をしないと、奇妙な制約違反の犠牲になります。 – Flimzy
今日私が学んだことの他の何か:-P – Bojangles