MyBatisの問題解決のSQLインジェクション

SQLインジェクション誰もが精通している、一般的な攻撃では、攻撃者が情報やURLインターフェイスの形でいくつかの奇妙なSQLフラグメントを入力し、例えば、「または 『1』 = 『1』」このステートメントは、可能侵攻です不十分なパラメータをチェックするアプリケーション。このような攻撃を防ぐためにいくつかの作業を行うために私たちのアプリケーションを必要としているので。そのようなソフトウェアを銀行などの一部の高セキュリティアプリケーションでは、多くの場合、当然のことながら非常に安全な方法でSQLインジェクションを防ぐために、このようなAの方法で、すべてのSQL文のストアドプロシージャを置き換えるために使用されるが、我々は通常の開発、それであってもよいですこれは、剛性の方法を必要としません。

SQL文が手動で私たち自身を記述する必要があります半自動の永続化層のフレームワーク、もちろん、この時、SQLインジェクションを防ぐために必要として、MyBatisのフレームワーク。次のように実際には、SQLを有する、関数の構造に似て「+入力出力」機能を、MyBatisの:

<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br>
       select id,title,author,content from blog where id=#{id}
</select>

ここで、ParameterTypeが入力パラメータのタイプを指定する、resultTypeとは、出力パラメータのタイプを指定します。私たちは、SQLインジェクションを防ぐためにしたい場合は、上記に対応して、当然のことながら、入力パラメータに努力します。コードは、パラメータを渡した後、パラメータのSQLスプライシングされた部分に入力された上記のハイライトは、これはSQLであるあなたが表示されます、SQL文の実行をプリントアウト:

select id,title,author,content from blog where id = ?

入力パラメータは、SQLをプリントアウトするものに関係なく、このようなものです。これはMyBatisのプリコンパイルされた機能が有効になっているためで、SQLの実行前に、それは最初に実行、コンパイルする上でのSQLデータベースを送信し、直接コンパイルされたSQL、プレースホルダを置き換える「?」それに。これは、SQLインジェクションの問題を回避するために非常に良い方法があるので、SQLインジェクションは、プロセスの動作を構築することができますので。

どのようにSQL MyBatisのは、それをプリコンパイルされていますか?実際には、フレームの底に、職場でのJDBC PreparedStatementクラスで、私たちはPreparedStatementのステートメントサブクラスに精通し、そのオブジェクトは、プリコンパイルされたSQL文が含まれています。この「準備完了」のアプローチが唯一の安全性を向上させることはありませんが、SQLはすでにコンパイルためにも、SQL複数回の実施では、効率を向上させることができ、再コンパイル時実行に不要になりました。

とにかく、我々はSQLインジェクションにそれを防ぐことができますMyBatisのを使用することができるようになりますか?もちろん、次のコードを見ていません。

<select id=“orderBlog“ resultType=“Blog“ parameterType=map>

       select id,title,author,content from blog order by ${orderParam}

</select>

注意深い観察、 "#{XXX}" によってインラインフォーマットパラメータは$ {XXX}となります。私たちは「orderParam」割り当てられた「ID」パラメータを与えた場合、このようなSQLを、プリントアウト:

IDによるブログの順序からID、タイトル、著者、コンテンツを選択

明らかに、これは、SQLインジェクションを防ぐことはできません。MyBatisのでは、 " X X Xこれは一種のフォーマットタイプパラメータの数ができ、直接アクセスパラメータ SQlは訳をからしていないことができないよう回避の注入を攻撃ヒットしかし、関与ダイナミックさの状態テーブルのみすることができ作る使用を {XXXの}「形式そのようなパラメータは、そのようなパラメータは、我々は、手動でコードに必要ように移植することを防止するために処理します。

結論:MyBatisのマッピングされた文の準備、可能な限りこのような形式で、「#{XXX}」。あなたが仕事をするために「$ {XXX}」このようなパラメータを使用するように強制した場合、手動でSQLインジェクション攻撃を防ぐためにフィルタリング。

公開された77元の記事 ウォン称賛39 ビュー80000 +

おすすめ

転載: blog.csdn.net/qq_33824312/article/details/76263755