2017-01-12 8 views
2

SQLインジェクションに対して両方の機能がサニタイズされていますか?たとえば、次の点を考慮します。JDBI - JDBIの@defineと@bindの違いは何ですか?

@SqlUpdate("INSERT INTO <tableName> (<columns>) VALUES (<values>)") 
    public abstract void addRowToDataset(@Define("tableName") String tableName, @Define("columns") String columns, @BindIn("values") Collection<Object> values); 

私の現在の理解は、クエリにあるよう@defineは文字通りの文字列を挿入しますが、消毒は@bindないということです。したがって、columnsとtableName parametersを制御し、valuesパラメータだけがユーザー入力である場合は、問題ありません。

答えて

2

私は同じ質問に出くわして、驚くほど見つけにくい答えを見つけました。同僚は、それはプログラミング世代前のそれはまさに一般的な知識であると私に伝えているので、ソフトウェアが進化するにつれてそのドキュメントは忘れ去られていたかもしれません。

実際、OracleのBinding and Definingは有望であるようですが、「定義する」とは結果を取得するための参照を設定することを意味するため、誤解を招きます.JDBIの意味ではありません。私の同僚が正しければここ

は、彼らが実際に何を意味するかです:

  • @Defineは定数のためであり、形式<field>を補間します。
  • @Bindは変数であり、フォーマット:field(「名前付きパラメータ」)を補間します。あなたは正しい:バインディングの副作用はサニタイズが発生することです。
  • @BindInはリスト用であり、フォーマット(element IN (<field>))を補間します。要素も消毒されています。

私の間違いは、補間は常に空の文字列であることになった@Bindパラメータのため<field>形式を使用していました。

関連する問題