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を
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条件では$を使用してはいけません。