2017-06-20 18 views
0

SQLインジェクションからパラメータ化されたSQLクエリを保護したい。私は、PreparedStatementを使ってSQLインジェクションを回避する方法について説明した記事を読んだ。 link特殊文字からのSQLインジェクションを防ぐ方法

記事によると、preparedstamentはキャッシュからプリコンパイルされたクエリを選択するのに役立ち、レースホルダは最終ステップでユーザーデータに置き換えられ、クエリは再びコンパイルされません。したがって、クエリが1回だけコンパイルされるため、ユーザー入力としてSQLクエリを提供する場合は、SQLインジェクションを避けることができます。

しかし、誰かが 'x' = 'x'などの特殊文字を含む文字列を与えるとどうなりますか?たとえば、「SELECT * FROM users WHERE username = 'blah' AND password = 'foo' OR 'x' = 'x'」のように、プレースホルダが 'x' = 'x'のようなユーザデータで置き換えられると、 Java PreparedStatementは、これらの特殊文字を処理しますか?

誰もが、私はこの

+2

プリペアドステートメントはこれを処理する必要はありません。なぜなら、クエリとデータは別々にサーバーに送信されるからです。 – CBroe

+0

ORはどのように追加する必要がありますか? – baao

+0

これを読んでくださいhttps://stackoverflow.com/questions/1582161/how-does-a-preparedstatement-avoid-or-prevent-sql-injection –

答えて

1

を理解する助けてください基本的には、データベースエンジンは、プレースホルダでSQL文字列を解析し、その部分だけが実行されることを覚えています。

これを実行すると、データを受け入れ、プレースホルダを実際のデータに置き換えます。

これは、誰かが何らかの形でSQL文字列を取得してSQLを破損し、それが何か他のことをするために管理している場合、データベースエンジンは実行されないテキストとして扱われることを意味します。

このため、完全なSQL文をテキストフィールドに入力する可能性があり、データベースエンジンによって解析されて実行されるのではなくテキストとして挿入されるため、コードは「安全」です(常に

これはJAVAとの排他的ではなく、PHPなどでも同様に動作します。通常とは異なる方法でクエリを処理するようデータベースに指示しています。

関連する問題