この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 12749|答える: 0

[出典] mybatisはSQLインジェクションを防止します

[リンクをコピー]
掲載地 2018/08/16 10:57:34 | | |
SQLインジェクションは、今日でも非常に一般的なシンプルな攻撃ベクターです。 その理由は、まさに愚かなパッチがなかったからです。 なぜそう言うのか、例としてJAVAを例に挙げてみましょう。

データベースにこのようなテーブルが存在すると仮定します:


次にJDBCアクションテーブルを使います:


上記のコードは一部の開発者によく使われています。 受信するuserIdパラメータが「3;」である状況を想像してください。 ドロップテーブルユーザー; 実行されるSQL文は以下の通りです:


データベースがコンパイルされ実行された後、ユーザーテーブルは削除されます。 ほら、簡単なSQLインジェクション攻撃が効果を発揮します! これは上記のコードがプログラミング仕様に準拠していないためです。

仕様に従ってプログラムすれば、SQLインジェクションは存在しません。 これもまた当てはまりますSQLインジェクションを避ける最初の方法:事前コンパイル済みの文、コードは以下の通りです:


なぜ上記のコードにはSQLインジェクションが存在しないのでしょうか? 事前コンパイル済み文が使われているため、事前コンパイル済み文は「id = in user from name from user」を設定します。 文は事前にコンパイルされていて、実行時に入力パラメータで置き換えるだけでいいのですか? プレースホルダーでも問題ありません。 最初の非準拠の場合、プログラムはSQL文を書き、ユーザーが渡した内容でコンパイルします。これがまさに問題です。

事前コンパイル済み文の使用に加え、もう一つの選択肢がありますSQLインジェクション攻撃を回避する方法:ストアドプロシージャ。 ストアドプロシージャとは、特定の関数を実行するSQL文の集合であり、それをコンパイルしてデータベースに保存します。ユーザーはストアドプロシージャを呼び出してパラメータを指定することで実行できます(ストアドプロシージャにパラメータがある場合)、これによりSQLインジェクション攻撃も回避できます

上記のコードに対応するストアドプロシージャは以下の通りです。

もちろん、フロントエンドで文字チェックを行うことも可能で、これはSQLインジェクションを避ける方法の一つです。例えば、上記のuserIdパラメータではセミコロンが入っているか確認するとエラーが表示されます。
しかし、最も根本的な理由は、アプリがデータベースにアクセスする際に最小権限を使わないためにSQLインジェクション攻撃が存在することです。 どうやら全員がrootアカウントを使ってデータベースにアクセスしているようです。

では、MyBatisはどのようにしてSQLインジェクション攻撃を回避しているのでしょうか? あるいは、上のテーブルユーザーを例に挙げてみましょう。
例えば、マッパーファイルが次の通りだとします:


対応するJavaファイルは以下の通りです:


userId="34; ドロップテーブルユーザー; その後、印刷された声明は次のように述べられています。


入力されたユーザーIDに関わらず、彼のSQL文はこうです。 これは、mybatisが基礎実装で事前コンパイル済み文を使用しているためです。 データベースがその文を実行するとき、事前にコンパイル済みの文を直接使い、その後プレースホルダーを渡し先のuserIdに置き換えます。 とにかく走ってきて。 まずプレースホルダーを交換する? コンパイルのプロセスが行われるため、SQL注入が生き残る余地はありません。

では、MyBatisはどのようにしてSQLのプリコンパイルを行うのでしょうか? 実際、PreparedStatementクラスはフレームワークの下部で使われています。 PreparedStaementクラスはSQL注入を回避するだけでなく、同じSQL文をN回実行した場合に(N〜1回)のコンパイル時間を節約できるため、効率が向上します。

上記の文を以下に変えると:

userId="34; ドロップテーブルユーザー; その後、印刷された声明は次のように述べられています。

現時点でmybatisは事前コンパイル済みの文を使わず、まず文字列をスティッチし、その後コンパイルを行います。これはまさにSQLインジェクションの効果です。
したがって、mybatisのマッピング文を書く際は「#{xxx}」という形式を使うようにしてください。 「${xxx}」のようなパラメータを使う必要がある場合は、SQLインジェクション攻撃を防ぐために手動でフィルタリングする必要があります。





先の:C#の疑問符? オペレーター
次に:IDEAにおける多行コメントおよびコメント解除ショートカット
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com