Java 防止SQL 注入和脚本注入

项目做完了,发现存在SQL注入漏洞和脚本注入的漏洞,如果输入特殊符号如’之类的,后台会报脚本错误。

这里提供一个好的解决办法[code]public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();

	Map<String, Object> paraMap = actionContext.getParameters(); // 获取页面所有提交的参数
	// 以Map形式存放
	for (Iterator it = paraMap.entrySet().iterator(); it.hasNext();) { // 迭代
		Map.Entry e = (Map.Entry) it.next();
		Object obj = e.getValue(); // 参数的值,也就是页面输入的内容, 是Object类型
		String val = "";
		if (obj instanceof String[]) { // 注意:这里不是String类型。如果obj是String数组类型,则取数组第一索引的值
			String[] strs = (String[]) obj;
			val = strs[0]; // 这样就把参数的值(页面提交的原始数据)赋予了val
		} else {
			val = obj.toString();
		}

// System.out.println(“转换前的值” + val);
// val = AppUtil.Html2Text(val);
val =StringEscapeUtils.escapeSql(val);
// System.out.println(“escapeSql:” + val);
//val =StringEscapeUtils.escapeHtml(val);这里发现如果是汉字的话会有问题
val = escapeHtml(val);//自己写的过滤方法
// System.out.println(“escapeHtml:” + val);

		// //转换,过滤HTML标签有很多方法,commons.lang里好像也有,这里我自己找的,见下文

// System.out.println(“转换后的值” + val);

		paraMap.put((String) e.getKey(), val);// 这句可不能忘了,把转换后的值再赋予对应的参数名

	}
	return invocation.invoke(); // action继续执行下去,固定写法

}

public String escapeHtml(String value)
{
	value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");   
    value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");   
    value = value.replaceAll("eval\\((.*)\\)", "");   
    value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");   
    value = value.replaceAll("script", "");  
    return value;
}[/code]