Spring MVCはインターセプター処理によりsql注入、クロスステーションXSS攻撃リスク(jeecg)を処理する
7445 ワード
最近、以前作った政府のウェブサイトが情報セキュリティ部門にスキャンされ、いくつかのリスクがあり、セキュリティ報告書を送った.だからこのサイトのセキュリティアップグレードを始めました.その主ないくつかの問題はsql注入リスク、クロスステーションxss攻撃、リンク注入問題である.
まず、sql注入とは何か、度娘がたくさんいると、公式言語はあまり話さないので、自分の理解を話しましょう.
sql注入とはurlまたはpostを介してデータをコミットする場合、文字列タイプのパラメータがsql文に転送され、最終的にデータベースを破壊したり、人に見られない目的を達成したりすることです.
ビジネスにurlにパラメータが必要な場合があります.例えば?type=xxx一部の人はtypeをsql文に書きます
例えば:?type='or 1=1–最終的につづられたsql文は、select*from table where disabled=0 and type="or 1=1–and id=1–and id=1のように–後の条件がブロックされ、結果として1=1、つまりこのテーブルのすべてのデータがクエリーされます.
これはまあ、一番やさしいですが、入力したパラメータをupdate delete dropにするのは面倒ではありません.
クロスステーション攻撃とリンク注入の差は少なく、java、htmlのコードがいくつか注入されます.同じ処理です.
最も簡単で、直接的で、効果的な方法を説明しましょう.
直接springのブロックを書いて処理して、sqlが注入したのは直接ブロックしてアクセスしないで、いくつかのめちゃくちゃなパラメータも正常にアクセスを続けることができないので、他の注入は整理すればいいです.
次にspring-mvc.xml構成にブロッキングを追加します.
これで、一波をテストして、基本的に問題を解決します.
転載は出典@Sychelを明記してください
まず、sql注入とは何か、度娘がたくさんいると、公式言語はあまり話さないので、自分の理解を話しましょう.
sql注入とはurlまたはpostを介してデータをコミットする場合、文字列タイプのパラメータがsql文に転送され、最終的にデータベースを破壊したり、人に見られない目的を達成したりすることです.
ビジネスにurlにパラメータが必要な場合があります.例えば?type=xxx一部の人はtypeをsql文に書きます
例えば:?type='or 1=1–最終的につづられたsql文は、select*from table where disabled=0 and type="or 1=1–and id=1–and id=1のように–後の条件がブロックされ、結果として1=1、つまりこのテーブルのすべてのデータがクエリーされます.
これはまあ、一番やさしいですが、入力したパラメータをupdate delete dropにするのは面倒ではありません.
クロスステーション攻撃とリンク注入の差は少なく、java、htmlのコードがいくつか注入されます.同じ処理です.
最も簡単で、直接的で、効果的な方法を説明しましょう.
直接springのブロックを書いて処理して、sqlが注入したのは直接ブロックしてアクセスしないで、いくつかのめちゃくちゃなパラメータも正常にアクセスを続けることができないので、他の注入は整理すればいいです.
package org.jeecgframework.core.interceptors;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SqlInjectInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
Enumeration names = arg0.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String[] values = arg0.getParameterValues(name);
for(String value: values){
//sql
if(judgeSQLInject(value.toLowerCase())){
arg1.setContentType("text/html;charset=UTF-8");
arg1.getWriter().print(" , !");
return false;
}
// xss
clearXss(value);
}
}
return true;
}
/**
*
* @param value
* @return
*/
public boolean judgeSQLInject(String value){
if(value == null || "".equals(value)){
return false;
}
String xssStr = "and|or|select|update|delete|drop|truncate|%20|=|-|--|;|'|%|#|+|,|//|/| |\\|!=|(|)";
String[] xssArr = xssStr.split("\\|");
for(int i=0;iif(value.indexOf(xssArr[i])>-1){
return true;
}
}
return false;
}
/**
* xss
*
* @param value
* @return
*/
private String clearXss(String value) {
if (value == null || "".equals(value)) {
return value;
}
value = value.replaceAll(", ").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replace("\\)", ")");
value = value.replaceAll("'", "'");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']",
"\"\"");
value = value.replace("script", "");
return value;
}
}
次にspring-mvc.xml構成にブロッキングを追加します.
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.jeecgframework.core.interceptors.SqlInjectInterceptor" />
mvc:interceptor>
これで、一波をテストして、基本的に問題を解決します.
転載は出典@Sychelを明記してください