ホームページ  >  記事  >  Java  >  Mybatis が SQL インジェクションを防ぐ方法のコード例

Mybatis が SQL インジェクションを防ぐ方法のコード例

黄舟
黄舟オリジナル
2017-06-18 10:12:301355ブラウズ

この記事では SQL インジェクションを防ぐための Mybatis の関連情報を紹介します。非常に優れており、必要な方は参考にしてください。

SQL インジェクションは攻撃者にとってよく知られた手法です。インターフェイス上のフォーム情報や URL に「or '1'='1'」などの奇妙な SQL フラグメントを入力すると、パラメータ検証が不十分なままアプリケーションに侵入される可能性があります。したがって、このような攻撃を防ぐためにアプリケーションで何らかの作業を行う必要があります。銀行ソフトウェアなどの一部の

安全なアプリケーションでは、SQL インジェクションを防ぐためにすべての SQL ステートメントを ストアド プロシージャ に置き換えるのによく使用されます。これはもちろん非常に安全な方法ですが、通常、開発ではこの厳格なアプローチが使用される可能性があります。必要ありません。

mybatis

フレームワーク半自動化された永続層フレームワークとして、SQL ステートメントを自分たちで手動で記述する必要があります。もちろん、現時点では SQL インジェクションを防ぐ必要があります。実際、Mybatis の SQL は、次のように、function と同様に「入力 + 出力」関数を備えた構造です。


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

ここで、parameterType は入力パラメータの型を示し、resultType は出力パラメータの型を示します。上記のことを受けて、SQL インジェクションを防ぎたければ、入力パラメータに力を入れるのは当然です。上記のコードで強調表示されている部分は、SQL で入力パラメーターが結合されている部分です。パラメーターを渡したら、実行された SQL ステートメントが次のように表示されることがわかります。どのようなパラメータを入力しても、出力される SQL はすべてこんな感じです。これは、mybatis がプリコンパイル機能を有効にしているためです。SQL が実行される前に、上記の SQL がコンパイルのためにデータベースに送信され、コンパイルされた SQL が直接使用され、プレースホルダー「?」が置き換えられます。 SQL インジェクションはコンパイル プロセスにのみ影響するため、この方法は SQL インジェクションの問題を効果的に回避できます。

mybatis はどのようにして SQL プリコンパイルを実現しますか?実際、フレームワークの下部では、jdbc の PreparedStatement クラスが機能しています。PreparedStatement は、私たちがよく知っている Statement のサブクラスであり、その

オブジェクト
にはコンパイルされた SQL ステートメントが含まれています。この「準備完了」アプローチにより、セキュリティが向上するだけでなく、SQL を複数回実行する際の効率も向上します。その理由は、SQL がコンパイルされており、再度実行するときに再度コンパイルする必要がないためです。

そういえば、mybatisを使えばSQLインジェクションを確実に防ぐことができるでしょうか?もちろんそうではありません。以下のコードを見てください:

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

よく見てください、インラインパラメータの形式が「#{xxx}」から ${xxx} に変更されています。 「id」の値をパラメータ「orderParam」に割り当てて SQL を出力すると、次のようになります:

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


明らかに、これは SQL を防ぐことはできません注射。 mybatis では、「${xxx}」形式のパラメータが SQL のコンパイルに直接関与するため、インジェクション攻撃は避けられません。ただし、動的なテーブル名と列名に関しては、「${xxx}」などのパラメーター形式のみを使用できるため、インジェクションを防ぐために、そのようなパラメーターをコード内で手動で処理する必要があります。

結論: mybatis のマッピング文を記述するときは、「#{xxx}」の形式を使用するようにしてください。 「${xxx}」などのパラメータを使用する必要がある場合は、SQL インジェクション攻撃を防ぐために手動でフィルタリングする必要があります。

以上がMybatis が SQL インジェクションを防ぐ方法のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。