5

SQLインジェクションを回避するために、通常、ここでデモを行い、stackoverflowにもサンプルがあるため、HQLでは位置パラメーター名前付きパラメーターを使用できます。使用時にどのような手順を踏むことができるか知りたいのですが、サンプルコードや役立つリンクについて教えてください。 Criteria

編集
また、オブジェクトを保存するときに?たとえば、オブジェクトにString変数があり、誰かが脆弱なSQLクエリをオブジェクトに割り当てることができるとします。

 myObject.setName(somevulnerablesql); session.save(myObject); 

その場合、オブジェクトに割り当てる前に、ユーザー入力を個別にチェックする必要がありますか?またはそのようなSQLインジェクションを回避するための他のステップ?

4

2 に答える 2

4

Criteria-Objectが安全なHSQLを作成すると確信しています。

Expressionオブジェクトには注意する必要があります。そこでSQLインジェクションを作成できます。しかし、生成されたSQLを見てください:Hibernateは実際のSQLを表示します

編集: Hibernateに大きなバグがない限り、String保存する前にSがエスケープされていることを確認する必要はありません。Hibernateはプリペアドステートメントで動作します。したがって、文字列の連結や、HibernateセッションでのSQLインジェクションはありません。

ただし、Hibernateで出力を読み取った後は、出力をエスケープする必要がある場合があります。例:エンティティユーザーがいます

class User{
    String name;
}

そして、ユーザーを「'」または1 = 1; DROPDATABASEuser;-"と呼びます。その文字列はデータベース内に保存されます。Criterionオブジェクトを使用してユーザーにクエリを実行すると、(データベースを削除せずに)ユーザーが見つかります。Expressionオブジェクトを使用してユーザーにクエリを実行すると、データベースを削除できます(文字列を含む場合)。

ユーザーの名前をHTMLに出力する場合は、出力をエスケープする必要があります。そうしないと、名前の付いたユーザーが"/><script>evilJavascript()</script>アプリケーションに悪影響を及ぼします。

編集2: ここを見てください:https ://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

于 2012-04-12T11:52:21.467 に答える
3

基準では、脆弱なSQL / HQLを自分で作成することはできないため、SQLインジェクションに問題はありません(Hibernate自体にバグがない限り)。

編集

@ckuetbachが指摘したように、Criteriaでは実際にExpression.sql(String sql)またはを使用してSQLを記述できますRestrictions.sqlRestriction(String)

于 2012-04-12T11:50:07.850 に答える