1、sql注入问题。
1、先对参数使用增则表达式匹配过滤报警
if (!StrUtil.isValidSql(param.toString())) {
throw new Exception("检测到非法的参数!" + param);
}
public static String SQL_VALID_REG = "[\\s\\S]*(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)[\\s\\S]*"
+"[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
/**
* @category 校验是否有sql注入
* @param str
* @return
*/
public static boolean isValidSql(String str){
String[] matchs = matchAll(str, SQL_VALID_REG,0);
if(matchs.length>0){
System.err.println("发现sql注入攻击:"+str+">>"+Arrays.asList(matchs).toString());
return false;
}
return true;
}
/**
* 正则表达式匹配
* @param str
* @param reges
* @return
*/
public static String[] matchAll(String str,String reges,int group){
Pattern p = Pattern.compile(reges);
Matcher m = p.matcher(str);
List<String> list = new ArrayList<String>();
while(m.find()){
list.add(m.group(group));
}
return list.toArray(new String[list.size()]);
}
2、sql用预编译的方式,即preparedstatement很多框架都用的它。
2、xss跨域攻击问题
1、也可以用正则表达式过滤
private boolean tagByRegular(String obj)
{
Pattern pattern = Pattern
.compile(
"(.*\\s*)((<\\s*script\\s*)|(<\\s*embed\\s*)|(<\\s*style\\s*)|(<\\s*img\\s*)|(<\\s*image\\s*)|(<\\s*frame\\s*)|(<\\s*object\\s*)|(<\\s*iframe\\s*)|(<\\s*a\\s*)|(<\\s*frameset\\s*)|(<\\s*meta\\s*)|(<\\s*xml\\s*)|(<\\s*applet\\s*)|(\\s*onmouse\\s*)|(<\\s*link\\s*)|(\\s*onload\\s*)|(\\s*onblur\\s*)|(\\s*onchange\\s*)|(\\s*onclick\\s*)|(\\s*ondblclick\\s*)|(\\s*onfocus\\s*)|(\\s*onkey\\s*)|(\\s*onselect\\s*)|(\\s*alert\\s*\\())(.*\\s*)",
Pattern.CASE_INSENSITIVE);
return pattern.matcher(obj).matches();
}
2、把特殊字符转义例如“<”转换为“<”等
可以利用开源的apache-lang.jar
StringEscapeUtils.escapeHtml()