mybatisを使用する場合はsql注入を防止します。
1735 ワード
もっと読む
一.where条件like注入 エラーコード例:select id,name from user where name like'、{name}% 注入方式1:テキストボックスで直接にname対応の値を%と書き、そのバックエンドsqlは直接select idになり、name from user where name“%”はすべてのデータを調べます。 注入方式2:エラーコードをselect idに変更し、name from user where name like'{name}%and id=1をテキストボックスで直接にname対応の値を%or'1'='1と書き、その後端sqlは直接selectid id idに変更し、name from user where name'%をすべてのデータに調べます。 解決方法:sqlを
一.where条件like注入 エラーコード例:select id,name from user where name like'、{name}% 注入方式1:テキストボックスで直接にname対応の値を%と書き、そのバックエンドsqlは直接select idになり、name from user where name“%”はすべてのデータを調べます。 注入方式2:エラーコードをselect idに変更し、name from user where name like'{name}%and id=1をテキストボックスで直接にname対応の値を%or'1'='1と書き、その後端sqlは直接selectid id idに変更し、name from user where name'%をすべてのデータに調べます。 解決方法:sqlを
select id,name from user where name like CONCAT(#{name},'%’) select id,name from user where name like #{name}||’%’
ただし、このように注入方式2の抜け穴を回避できるだけでなく、nameが空かどうかや%を含むかどうかを判断し、再出発like文を含まないといけない。二、in条件注入 エラーコード例:select id,name from user where id in($id) 注入方式:直接idsを1に設定します。or(1=1で注入が完了します。sqlはselect id、name from user where id in(1)or(1=1)に設定して、全てのデータを検出します。 解決方法:sqlをforeach構造に変えます。select id,name from user
id in
#{item.id, jdbcType=NUMERIC}
三、列名、表名、order by注入 このいくつかは$というフォーマットしか使えません。テストと資料を見て、しばらくはいい解決方法がないので、書く時はできるだけ避けてください。 ドル形式の動的変数を使って、表が多くない場合、いくつかの同じsqlをコピーして表の名前を換えてもいいです。分表については、動的変数のチェックとマッチングが必要です。 列名、order byの後の列名も同じです。また、フロントエンドページでこれらのデータが入ることは避けられます。 これらのsql注入方式は以下の通りです。 1.列名注入方式:select$column'name from userで、columnを(select sleep(5))、sqlをselectにする (select sleep(5)from user;または他の列名が知られている場合、columnをpwdに変更し、sqlはselect pwd name from userに変更する。 2.テーブル名注入:select name、age from$table、columnを(select pwd name、prexe from dept)bとすると、sqlはselect name、age from(select pwd name、prexe from dept)bとなり、別の既知のデータで正常なテーブルに注入されます。 これを出来るだけ使うことができます。正常where条件では$を使用してはいけません。