11 changed files with 29 additions and 233 deletions
@ -1,196 +0,0 @@ |
|||||
package com.zdxt.auth.framework.config; |
|
||||
|
|
||||
import cn.hutool.http.HttpException; |
|
||||
import org.slf4j.Logger; |
|
||||
import org.slf4j.LoggerFactory; |
|
||||
|
|
||||
import javax.servlet.ReadListener; |
|
||||
import javax.servlet.ServletInputStream; |
|
||||
import javax.servlet.ServletOutputStream; |
|
||||
import javax.servlet.http.HttpServletRequest; |
|
||||
import javax.servlet.http.HttpServletRequestWrapper; |
|
||||
import javax.servlet.http.HttpServletResponse; |
|
||||
import java.io.BufferedReader; |
|
||||
import java.io.ByteArrayInputStream; |
|
||||
import java.io.IOException; |
|
||||
import java.io.InputStreamReader; |
|
||||
import java.nio.charset.Charset; |
|
||||
import java.util.regex.Matcher; |
|
||||
import java.util.regex.Pattern; |
|
||||
|
|
||||
public class XssHttpServletRequestWraper extends HttpServletRequestWrapper { |
|
||||
|
|
||||
Logger log = LoggerFactory.getLogger(this.getClass()); |
|
||||
|
|
||||
|
|
||||
public XssHttpServletRequestWraper() { |
|
||||
super(null); |
|
||||
} |
|
||||
|
|
||||
public XssHttpServletRequestWraper(HttpServletRequest httpservletrequest) { |
|
||||
super(httpservletrequest); |
|
||||
} |
|
||||
|
|
||||
//过滤springmvc中的 @RequestParam 注解中的参数
|
|
||||
public String[] getParameterValues(String s) { |
|
||||
|
|
||||
String str[] = super.getParameterValues(s); |
|
||||
if (str == null) { |
|
||||
return null; |
|
||||
} |
|
||||
int i = str.length; |
|
||||
String as1[] = new String[i]; |
|
||||
for (int j = 0; j < i; j++) { |
|
||||
//System.out.println("getParameterValues:"+str[j]);
|
|
||||
as1[j] = cleanXSS(cleanSQLInject(str[j])); |
|
||||
} |
|
||||
log.info("XssHttpServletRequestWraper净化后的请求为:==========" + as1); |
|
||||
return as1; |
|
||||
} |
|
||||
|
|
||||
//过滤request.getParameter的参数
|
|
||||
public String getParameter(String s) { |
|
||||
String s1 = super.getParameter(s); |
|
||||
if (s1 == null) { |
|
||||
return null; |
|
||||
} else { |
|
||||
String s2 = cleanXSS(cleanSQLInject(s1)); |
|
||||
log.info("XssHttpServletRequestWraper净化后的请求为:==========" + s2); |
|
||||
return s2; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//过滤请求体 json 格式的
|
|
||||
@Override |
|
||||
public ServletInputStream getInputStream() throws IOException { |
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers(super.getInputStream ()).getBytes ()); |
|
||||
|
|
||||
return new ServletInputStream() { |
|
||||
|
|
||||
@Override |
|
||||
public int read() throws IOException { |
|
||||
return bais.read(); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean isFinished() { |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean isReady() { |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void setReadListener(ReadListener readListener) { |
|
||||
|
|
||||
} |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
public String inputHandlers(ServletInputStream servletInputStream){ |
|
||||
StringBuilder sb = new StringBuilder(); |
|
||||
BufferedReader reader = null; |
|
||||
try { |
|
||||
reader = new BufferedReader(new InputStreamReader(servletInputStream, Charset.forName("UTF-8"))); |
|
||||
String line = ""; |
|
||||
while ((line = reader.readLine()) != null) { |
|
||||
sb.append(line); |
|
||||
} |
|
||||
} catch (IOException e) { |
|
||||
e.printStackTrace(); |
|
||||
} finally { |
|
||||
if (servletInputStream != null) { |
|
||||
try { |
|
||||
servletInputStream.close(); |
|
||||
} catch (IOException e) { |
|
||||
e.printStackTrace(); |
|
||||
} |
|
||||
} |
|
||||
if (reader != null) { |
|
||||
try { |
|
||||
reader.close(); |
|
||||
} catch (IOException e) { |
|
||||
e.printStackTrace(); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
return cleanXSS(sb.toString ()); |
|
||||
} |
|
||||
|
|
||||
public String cleanXSS(String src) { |
|
||||
String temp = src; |
|
||||
|
|
||||
src = src.replaceAll("<", "<").replaceAll(">", ">"); |
|
||||
src = src.replaceAll("\\(", "(").replaceAll("\\)", ")"); |
|
||||
src = src.replaceAll("'", "'"); |
|
||||
src = src.replaceAll(";", ";"); |
|
||||
//bgh 2018/05/30 新增
|
|
||||
/**-----------------------start--------------------------*/ |
|
||||
src = src.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); |
|
||||
src = src.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41"); |
|
||||
src = src.replaceAll("eval\\((.*)\\)", ""); |
|
||||
src = src.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\""); |
|
||||
src = src.replaceAll("script", ""); |
|
||||
src = src.replaceAll("link", ""); |
|
||||
src = src.replaceAll("frame", ""); |
|
||||
/**-----------------------end--------------------------*/ |
|
||||
Pattern pattern = Pattern.compile("(eval\\((.*)\\)|script)", |
|
||||
Pattern.CASE_INSENSITIVE); |
|
||||
Matcher matcher = pattern.matcher(src); |
|
||||
src = matcher.replaceAll(""); |
|
||||
|
|
||||
pattern = Pattern.compile("[\\\"\\'][\\s]*javascript:(.*)[\\\"\\']", |
|
||||
Pattern.CASE_INSENSITIVE); |
|
||||
matcher = pattern.matcher(src); |
|
||||
src = matcher.replaceAll("\"\""); |
|
||||
|
|
||||
// 增加脚本
|
|
||||
src = src.replaceAll("script", "").replaceAll(";", "") |
|
||||
/*.replaceAll("\"", "").replaceAll("@", "")*/ |
|
||||
.replaceAll("0x0d", "").replaceAll("0x0a", ""); |
|
||||
|
|
||||
if (!temp.equals(src)) { |
|
||||
// System.out.println("输入信息存在xss攻击!");
|
|
||||
// System.out.println("原始输入信息-->" + temp);
|
|
||||
// System.out.println("处理后信息-->" + src);
|
|
||||
|
|
||||
log.error("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!"); |
|
||||
log.error("原始输入信息-->" + temp); |
|
||||
|
|
||||
throw new HttpException("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!"); |
|
||||
} |
|
||||
return src; |
|
||||
} |
|
||||
|
|
||||
//输出
|
|
||||
public void outputMsgByOutputStream(HttpServletResponse response, String msg) throws IOException { |
|
||||
ServletOutputStream outputStream = response.getOutputStream(); //获取输出流
|
|
||||
response.setHeader("content-type", "text/html;charset=UTF-8"); //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
|
|
||||
byte[] dataByteArr = msg.getBytes("UTF-8");// 将字符转换成字节数组,指定以UTF-8编码进行转换
|
|
||||
outputStream.write(dataByteArr);// 使用OutputStream流向客户端输出字节数组
|
|
||||
} |
|
||||
|
|
||||
// 需要增加通配,过滤大小写组合
|
|
||||
public String cleanSQLInject(String src) { |
|
||||
String lowSrc = src.toLowerCase(); |
|
||||
String temp = src; |
|
||||
String lowSrcAfter = lowSrc.replaceAll("insert", "forbidI") |
|
||||
.replaceAll("select", "forbidS") |
|
||||
.replaceAll("update", "forbidU") |
|
||||
.replaceAll("delete", "forbidD").replaceAll("and", "forbidA") |
|
||||
.replaceAll("or", "forbidO"); |
|
||||
|
|
||||
if (!lowSrcAfter.equals(lowSrc)) { |
|
||||
log.error("sql注入检查:输入信息存在SQL攻击!"); |
|
||||
log.error("原始输入信息-->" + temp); |
|
||||
log.error("处理后信息-->" + lowSrc); |
|
||||
throw new HttpException("sql注入检查:参数含有非法攻击字符,已禁止继续访问!!"); |
|
||||
|
|
||||
} |
|
||||
return src; |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
Loading…
Reference in new issue