2012-03-22 13 views
4

私はどこでも、私のクエリのためのPHP PDOを使用していますが、私は非常にまれな例ではまだ危険な変数が別のステートメントで使用されるときに実行後、保存されている「二次注入」があるかもしれないことをお読みください。2次SQL攻撃を防止するにはどうすればよいですか?

準備文でこれを防ぐことはできますか?私が確かに私は常にそれらを使用しますか?それとももっと予防措置を取らなければならないのですか?私はまだXSS攻撃に脆弱ですか?

は、私はまた、あなたのすべてが気にしない場合は、単に好奇心から、カップルより多くの質問がある:

  1. には英数字、スペースでSQLインジェクションを持っていることは可能ですし、1つのダッシュ? select * from something where name='$some_variable'のように。私が見たすべての例は、セミコロン、引用符、二重ダッシュなどの他の文字を必要とするようです。

  2. 私は、安全でない変数が別の文を形成するように設定することができ、多くのSQLの例、例えば

    $foo = "foo'); INSERT INTO users (name) VALUES ('hi"; 
    $bar = ("INSERT INTO users (name) VALUES ('$foo')"); 
    

を読んだしかし、私はちょうどテストとmysql_queryにも複数の文を許可していません。私はあなたがまだ1つのステートメント内に注射を持つことができることを知っていますが、PHPで複数のステートメントに問題がないことを確認できますか?データはコマンドとしてSQLエンジンによって読み取られるとき

+0

2次攻撃とは、データデータベース - >クエリ - >データベースを丸呑みしていることを意味します。「ローカルソース」のデータだけを使用していても、自分自身を挿入できます。 –

答えて

3

死者を打つていない(または、それは非常に生きている?)馬が...

注入にのみ発生します。非常に単純なケースでは、エスケープされていない"文字がデータに含まれ、データが"文字でカプセル化されている場合、SQLインジェクション攻撃が有効になっています。

任意の SQLインジェクションは、SQLステートメントに入るときに、常に入力データを適切に検証しエスケープすることです。これを行う簡単な方法は、SQL文にパラメータを安全に渡せるように、用意された文を使用することです。

各データベースライブラリは、エスケープやプリペアドステートメントを使用してのそれ自身の方法を持っています。 MySQLとPHPでは、あなたがmysqliライブラリを使用しているとき、EVERY TIME期間を使用する必要がありますmysqli_real_escape_string()を、持っています。

PDOライブラリは、独自の方法がありますが、私が正しくリコール場合は、プリペアドステートメントは、PDOの大きな部分を占めていた - 彼らに時間の100%を使用して、あなたはその点でOKになります。 agains XSS攻撃を防ぐために

+0

私はいつもサニタイズやプリペアドステートメントを使用している限り、私はどんなSQLインジェクションやXSSに対しても大丈夫でしょうか? – Raekye

+0

@op:XssとSQLインジェクションは2つの異なる問題です。 xssでは、htmlpurifierを使用できます。それは良い仕事をします。 – itachi

関連する問題