2011-01-27 4 views
16

Ruby言語は静的に型付けされていないので嫌いですが、Spring/Hibernateでもっと多くの時間を費やすとRuby on Railsの機能が向上します。具体的には、アクティブレコードモデルによってSQLインジェクションが防止されます。この問題は、通常、Spring/Hibernateスタックでどのように処理されますか?あなたのユーザ入力が安全であることを確かめるために、どちらか一方のスクラブツールキットが付属していますか?SQLインジェクションはSpring/Hibernateの設定では通常どのように停止するのですか?

これはDAOを挿入するだけの場合には挿入に問題はありませんが、Select文を使用する場合は大きな問題です。

答えて

30

Hibernateを使用しているときは、SQLインジェクションは危険ではないはずです。

Hibernateクエリは、HQL(HibernateのSQLライクなクエリ言語)で記述されるか、オブジェクト指向のCriteria APIを使用して実装されます。

HQLが最も一般的であり、最も推奨されています。 Hibernateは、パラメータとして文字列を渡しているため、あなたはSQLインジェクションから保護されています。この形式では

Subscription sub = (Subscription) sessionFactory.getCurrentSession() 
     .createQuery("from Subscription sub where sub.verification = :verification") 
     .setString("verification", verification) 
     .uniqueResult(); 

;:通常は、このようなHQLクエリを記述しますそれはSQLの一部として解釈することはできません。

しかし、あなたがこのようなクエリを記述ひどく振る舞う場合...

Subscription sub = (Subscription) sessionFactory.getCurrentSession() 
     .createQuery("from Subscription sub where sub.verification = '" + verification + "'") 
     .uniqueResult(); 

は...あなたは、SQLインジェクションから保護されていません。しかし、あなたはこのような質問を書くべきではありません!文字列をクエリに追加すると、どのフレームワークもあなたを守るとは思えません。

最後に、Hibernate Criteria APIを使用すると、SQLインジェクションから自動的に保護されます。これは、Criteria APIを使用しているときにHibernateが基礎となるクエリを構築するため、SQLインジェクションを妨げるような方法で実行されます。

1

あなた自身の質問に答えてきたと思います.HQLを最後の手段として使用している場合は、潜在的な攻撃ポイントの95%が削除されている可能性があります。そして、あなたがそれらの厄介な縁のケースでのみそれを使用しているので、あなたが実際にやっていることにもっと注意を払う可能性が高いです。

関連する問題