IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 前台RequestPayload传值 后台RequestBody 接收不到 -> 正文阅读

[移动开发]前台RequestPayload传值 后台RequestBody 接收不到

前台RequestPayload传值 后台RequestBody 接收不到

问题描述 字段值为standard_model的药具规格 后台接受值为null

问题定位:xss拦截

scriptPattern = Pattern.compile("and", Pattern.CASE_INSENSITIVE);
        input = scriptPattern.matcher(input).replaceAll("");
        
        
后台进行了xss拦截 过滤器的原因 对and字符进行了过滤 导致参数standard_model变成了stard_model
由此后台取值出现问题

此类问题在之后漏洞修复的时候要注意

附:正确解决方法

/**
 * xss请求处理类
 * */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
	HttpServletRequest orgRequest = null;
	private boolean isIncludeRichText = false;

	public static Pattern pattern_select = Pattern.compile("select",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_insert = Pattern.compile("insert",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_update = Pattern.compile("update",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_drop = Pattern.compile("drop",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_delete = Pattern.compile("delete",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_truncate = Pattern.compile("truncate",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_or = Pattern.compile("or",Pattern.CASE_INSENSITIVE);
	public static Pattern pattern_and = Pattern.compile("and",Pattern.CASE_INSENSITIVE);

	// 将<script>进行置换
	public static Pattern pattern_script = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
	// 将<src>进行置换
	public static Pattern pattern_src =  Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

	public XssHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) {
		super(request);
		orgRequest = request;
		this.isIncludeRichText = isIncludeRichText;
	}

	@Override
	public ServletInputStream getInputStream() throws IOException {
		// 非json类型,直接返回
		if (!super.getHeader("Content-Type").equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {
			return super.getInputStream();
		}
		// 为空,直接返回
		String json = IOUtils.toString(super.getInputStream(), "utf-8");
		if (StringUtils.isBlank(json)) {
			return super.getInputStream();
		}
		// xss过滤
		json = xssEncode(json,0);
		final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes());
		return new ServletInputStream() {
			@Override
			public boolean isFinished() {
				return true;
			}

			@Override
			public boolean isReady() {
				return true;
			}

			@Override
			public void setReadListener(ReadListener readListener) {

			}

			@Override
			public int read() throws IOException {
				return bis.read();
			}
		};
	}

	/**
	 * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
	 * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
	 */
	@Override
	public String getParameter(String name) {
		Boolean flag = ("content".equals(name) || name.endsWith("WithHtml"));
		if (flag && !isIncludeRichText) {
			return super.getParameter(name);
		}
		name = JsoupUtil.clean(name);
		String value = super.getParameter(name);
		if (StringUtils.isNotBlank(value)) {
			value = xssEncode(value,1);
		}
		return value;
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] arr = super.getParameterValues(name);
		if (arr != null) {
			for (int i = 0; i < arr.length; i++) {
				arr[i] = xssEncode(arr[i],1);
			}
		}
		return arr;
	}

	/**
	 * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
	 * getHeaderNames 也可能需要覆盖
	 */
	@Override
	public String getHeader(String name) {
		name = JsoupUtil.clean(name);
		String value = super.getHeader(name);
		if (StringUtils.isNotBlank(value)) {
			value = xssEncode(value,0);
		}
		return value;
	}

	private String xssEncode(String input,Integer type) {

		input = pattern_script.matcher(input).replaceAll("");
		// 避免src形式的表达式
        input = pattern_src.matcher(input).replaceAll("");
		Pattern  scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
        // 删除单个的 </script> 标签
        scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
        input = scriptPattern.matcher(input).replaceAll("");
        // 删除单个的<script ...> 标签
        scriptPattern = Pattern.compile("<script(.*?)>",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
		// 避免 eval(...) 形式表达式
        scriptPattern = Pattern.compile("eval\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 expression(...) 表达式
        scriptPattern = Pattern.compile("expression\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 javascript: 表达式
        scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 vbscript:表达式
        scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 οnlοad= 表达式
        scriptPattern = Pattern.compile("onload(.*?)=",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
        //将<svg>进行置换
        scriptPattern = Pattern.compile("<svg(.*?)>",Pattern.CASE_INSENSITIVE);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 οnerrοr= 表达式
        scriptPattern = Pattern.compile("onerror(.*?)=",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
        // 避免 alert(...) 形式表达式
        scriptPattern = Pattern.compile("alert\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        input = scriptPattern.matcher(input).replaceAll("");
		// 避免 prompt(...) 形式表达式
		scriptPattern = Pattern.compile("prompt\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
		input = scriptPattern.matcher(input).replaceAll("");

		// 避免过滤特殊字符
		if(type==1){
			scriptPattern = Pattern.compile("[`~!@#$%^&*()+=|''\\\\[\\\\]<>/?~!@#¥%……&*()——+|‘;:”“’。,、?]",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
			input = scriptPattern.matcher(input).replaceAll("");
			input = pattern_and.matcher(input).replaceAll("");
			input = pattern_or.matcher(input).replaceAll("");
			input = pattern_delete.matcher(input).replaceAll("");
			input = pattern_drop.matcher(input).replaceAll("");
			input = pattern_select.matcher(input).replaceAll("");
			input = pattern_insert.matcher(input).replaceAll("");
			input = pattern_update.matcher(input).replaceAll("");
			//去除执行SQL语句的命令关键字
		}

		return input;
	}

	/**
	 * 获取最原始的request
	 * 
	 * @return
	 */
	public HttpServletRequest getOrgRequest() {
		return orgRequest;
	}

	/**
	 * 获取最原始的request的静态方法
	 * 
	 * @return
	 */
	public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
		if (req instanceof XssHttpServletRequestWrapper) {
			return ((XssHttpServletRequestWrapper) req).getOrgRequest();
		}

		return req;
	}
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:33:51  更:2022-05-12 16:34:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:02:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码