プリペアドステートメントを使用してSQLインジェクションを防ぐためにどのようにJavaで構築クエリへ

Sebinマシュー:

私は、SQLインジェクション攻撃の可能性を防ぐために、このようなAの方法でクエリを作成する必要があります。

私は、クエリを構築するための二つの方法を知っています。

String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString();

String query = "select * from tbl_names where name = ? ";

最初のケースでは、私はすべてがのConnection.prepareStatement(クエリ)であります

後者の場合、私は次のように実行します。

PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);

私は、業界標準であるかを知りたいですか?あなたは、クエリを作成し、文を準備したり、すでに文を準備し、後でパラメータを渡すために、文字列の追記方法を使用していますか?

マークRotteveel:

コードのあなたの最初のフラグメントは、安全でないと、SQLインジェクションの脆弱性です。あなたはそのフォームを使用しないでください。

あなたの最初のフラグメントの安全を作成するには、手動でSQLインジェクションを防ぐために、値をエスケープする必要があります。それは正しく行うことは困難であり、値を処理する間違った方法を選択すると、潜在的に(あなたが整数列の文字列リテラルを供給する場合など、いくつかのデータベースシステムは、インデックスを使用しません)基礎となるデータベースに応じて、パフォーマンスを低下させる可能性があります。

第2の断片は、標準的な方法です。これは、SQLインジェクションに対して保護されます。このフォームを使用します。

パラメータプレースホルダを用いてプリペアドステートメントを使用すると、はるかに簡単であり、それはまた、値の異なるセットを使用してコンパイル文を再利用することができます。また、データベースに依存し、これは接続間でクエリプランを再利用するための追加的なパフォーマンス上の利点を持つことができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=335657&siteId=1