10

データベースと対話するために休止状態を使用しましたが、データベース層を SQL インジェクションに対して安全にしたいので、いくつかの調査を行ったところ、クエリをパラメーター化する必要があることがわかりました。なので:

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

次に、パラメータ化され、SQL インジェクションから保護されます。それとも、他に何かする必要がありますか...

もう1つ言及されました-「常にデータをエスケープする」どうすればそれを達成できますか??

4

1 に答える 1

4

わかりませんsetString()が、それが同じであれば、setParameter()SQLインジェクションを防ぐためにそれを行うだけで十分です。

アップデート

データをエスケープするということは、危険な値をデータベースに保存していないことを確認する必要があることを意味します。

簡単な例は、たとえば、引数を渡す場合です。

String name = "<script>alert('Hello');</script>";
//insert this name into Mother, and then when you load it from the database, it will be displayed    

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

クエリに対して、次にデータベースからこれをロードし、Webブラウザでレンダリングすると、スクリプトが実行されます。
フレームワークがすべての不正な文字をエスケープしていることを確認する必要があります。つまり、データベースに挿入する前にに 変更<します。フレームワークがこれを行わない場合は、手動で行う必要があります。コードを正しくエスケープするライブラリはたくさんあります。たとえば、この質問とそこにある答えを見てください。&lt;

于 2011-01-05T16:35:21.003 に答える