2011-07-04 8 views

答えて

2
  1. 常に信頼できない入力を検証します。
  2. すべての入力は信頼できません。入力を検証する方法

入力が何であるかに依存しますが、この場合には、それが-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29OP(何でも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"="を持つ新しいユーザーを挿入してください。

+0

+1いくつかのジョークでPDOやフレームワーク全体を推奨しません。 PDOには大きなメリットがありますが、それを使用せずに行うことができます。フレームワークも機能しますが、OPがこの目的のためにしか使用していない場合は、少し浪費します。標準のエスケープトリックに固執するだけです。 – Bojangles

+0

準備されたステートメント(PDOなど)を使用するのはうまくいきますが、良い習慣ですが、あなたの入力を検証しないという言い訳ではありません!あなたの入力を検証せずに、適切に設計されたスキーマを持っていて入力検証をしないと、奇妙な制約違反の犠牲になります。 – Flimzy

+0

今日私が学んだことの他の何か:-P – Bojangles

2

PDOに切り替えて、すべてのプレースホルダ付きの準備文を使用します。

0

ほとんどの回答では、データベースに保存するすべてのもの(フィールドプレースホルダ)をエスケープする必要があります。

しかし、私は最近、それなしので、あなたは、あなたのクエリ内のすべてのプレースホルダをエスケープする必要があることを発見した:「FROM句」の

プレースホルダは、ハッカーが任意のテーブルのデータにアクセスする可能性があります。

"WHERE句"のプレースホルダを使用すると、ハッカーは現在のテーブルのどの行にもアクセスできます。これは、ハッカーがログインしようとしたときにデータベースのユーザーとしてあなたのアプリケーションにアクセスする可能性があることを意味します。

関連する問題