post攻击 xxs_如何拦截post请求的xss攻击

这篇博客介绍了XssHttpServletRequestWrapper类,用于增强HttpServletRequest的安全性,通过白名单策略允许特定HTML标签,同时使用正则表达式过滤SQL注入。核心内容包括参数和头信息的验证,以及HTML标签和SQL注入的过滤方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {//白名单数组

private static final String[] WHITE_LIST = {"content"};

// 定义script的正则表达式

private static final String REGEX_SCRIPT = "

// 定义style的正则表达式

private static final String REGEX_STYLE = "

// 定义HTML标签的正则表达式

private static final String REGEX_HTML = "<[^>]+>";

// 定义空格回车换行符

private static final String REGEX_SPACE = "\\s*|\t|\r|\n";

//定义所有w标签

private static final String REGEX_W = "]*?>[\\s\\S]*?<\\/w[^>]*?>";

//定义sql注入

private static String reg = "(\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";public XssHttpServletRequestWrapper(HttpServletRequest request) {

super(request);

}@Override

public String[] getParameterValues(String parameter) {

String[] values = super.getParameterValues(parameter);

if (values == null) {

return null;

}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {

//白名单放行的只有HTML标签,sql标签还是要验证

if (isWhitelist(parameter)) {

if (sqlValidate(values[i])) {

encodedValues[i] = values[i];

}

encodedValues[i] = null;

}

encodedValues[i] = removeHtml(values[i]);

}return encodedValues;}@Override

public String getParameter(String parameter) {

String value = super.getParameter(parameter);

if (value == null) {

return null;

}

//白名单放行的只有HTML标签,sql标签还是要验证

if (isWhitelist(parameter)) {

if (sqlValidate(value)) {

return value;

}

return null;

}

return removeHtml(value);

}@Override

public String getHeader(String name) {

String value = super.getHeader(name);

if (value == null) {

return null;

}if (isWhitelist(name)) {

if (sqlValidate(value)) {

return value;

}

return null;

}

return removeHtml(value);

}

//\\b 表示 限定单词边界 比如 select 不通过 1select则是可以的

private static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);/**

* sql注入过滤器

* @param str

* @return

*/

private static boolean sqlValidate(String str) {

if (sqlPattern.matcher(str).find()) {

System.out.println("未能通过过滤器:str=" + str);

return false;

}

return true;

}/**

* 是否白名单,白名单的放行

*

* @param paramName

* @return

*/

private static boolean isWhitelist(String paramName) {

String lowerParam = paramName.toLowerCase();

String name = Arrays.stream(WHITE_LIST).filter(y -> y.toLowerCase().equals(lowerParam)).findAny().orElse(null);

return name != null;

}/**

* 移除HTML标签

* @param htmlStr

* @return

*/

private static String removeHtml(String htmlStr){

Pattern p_w = Pattern.compile(REGEX_W, Pattern.CASE_INSENSITIVE);

Matcher m_w = p_w.matcher(htmlStr);

htmlStr = m_w.replaceAll(""); // 过滤script标签

Pattern p_script = Pattern.compile(REGEX_SCRIPT, Pattern.CASE_INSENSITIVE);

Matcher m_script = p_script.matcher(htmlStr);

htmlStr = m_script.replaceAll(""); // 过滤script标签

Pattern p_style = Pattern.compile(REGEX_STYLE, Pattern.CASE_INSENSITIVE);

Matcher m_style = p_style.matcher(htmlStr);

htmlStr = m_style.replaceAll(""); // 过滤style标签

Pattern p_html = Pattern.compile(REGEX_HTML, Pattern.CASE_INSENSITIVE);

Matcher m_html = p_html.matcher(htmlStr);

htmlStr = m_html.replaceAll(""); // 过滤html标签

Pattern p_space = Pattern.compile(REGEX_SPACE, Pattern.CASE_INSENSITIVE);

Matcher m_space = p_space.matcher(htmlStr);

htmlStr = m_space.replaceAll(""); // 过滤空格回车标签

htmlStr = htmlStr.replaceAll(" ", ""); //过滤

return htmlStr.trim(); // 返回文本字符串

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值