ホームページ >Java >&#&チュートリアル >Java Mybatis が SQL インジェクション分析を阻止する
この記事では SQL インジェクションを防ぐための Mybatis の関連情報を紹介します。非常に優れており、必要な方は参考にしてください。
SQL インジェクションは攻撃者にとってよく知られた手法です。インターフェイス上のフォーム情報や URL に「or '1'='1'」などの奇妙な SQL フラグメントを入力すると、パラメータ検証が不十分なままアプリケーションに侵入される可能性があります。したがって、このような攻撃を防ぐためにアプリケーションで何らかの作業を行う必要があります。銀行業務ソフトウェアなどの一部の安全性の高いアプリケーションでは、SQL インジェクションを防ぐためにすべての SQL ステートメントをストアド プロシージャに置き換える方法がよく使用されます。これはもちろん非常に安全な方法ですが、日常の開発ではその必要がない場合があります。そのような厳格なアプローチのために。 半自動永続層フレームワークとして、mybatis フレームワークでは SQL ステートメントを手動で記述する必要があります。もちろん、現時点では SQL インジェクションを防ぐ必要があります。実際、Mybatis の SQL は、次のように、関数に似た「入力 + 出力」関数を備えた構造です。<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 インジェクション攻撃を防ぐためにパラメータを手動でフィルタリングする必要があります。
以上がJava Mybatis が SQL インジェクション分析を阻止するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。