封装HashMap加入URLdecoder解码器,防注入

2023-11-14

其中URLDecoder.decode有个好处,就是防止%sql注入,当然对其他字符无效了,当在input输入用户名时候‘10001%’,经过后台先获取,并解码,会报错:

package test;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class Test1 {

	public static void main(String[] arg0) {
		String target = "1001%";
		String charset = "UTF-8";
		try {
			/*
			 * System.out.println("---------URLDecoder处理前:--------" + target +
			 * "--->处理后===" + URLEncoder.encode(target, charset));
			 */
			System.out.println("---------URLDecoder处理前:--------" + target
					+ "--->处理后===" + URLDecoder.decode(target, charset));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

报错如下:

Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
	at java.net.URLDecoder.decode(URLDecoder.java:187)
	at test.Test1.main(Test1.java:17)

项目中用的是springMVC进行异常处理:

<bean id="exceptionResolver" class="com.ailk.base.exception.CustomSimpleMappingExceptionResolver">  
	    <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->  
	    <property name="defaultErrorView" value="error/failure"></property>  
	    <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->  
	    <property name="exceptionMappings">  
	        <props>  
	            <prop key="com.ailk.base.exception.SystemException">/error/500</prop>
	            <prop key="com.ailk.base.exception.BusinessException">/error/error</prop>
	            <prop key="java.lang.exception">error/500</prop> 
	        </props>  
	    </property>  
	</bean> 
package com.ailk.base.exception;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

public class CustomSimpleMappingExceptionResolver extends
		SimpleMappingExceptionResolver {

	@Override
	protected ModelAndView doResolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		// Expose ModelAndView for chosen error view.
		String viewName = determineViewName(ex, request);
		if (viewName != null) {// JSP格式返回
			System.out.println("------------------------------>>>1 " + (request.getHeader("accept").indexOf("application/json") > -1));
			System.out.println("------------------------------>>>2 " + (request
					.getHeader("X-Requested-With") != null && request
					.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1));
			if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
					.getHeader("X-Requested-With") != null && request
					.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
				// 如果不是异步请求
				// Apply HTTP status code for error views, if specified.
				// Only apply it if we're processing a top-level request.
				Integer statusCode = determineStatusCode(request, viewName);
				if (statusCode != null) {
					applyStatusCodeIfPossible(request, response, statusCode);
				}
				return getModelAndView(viewName, ex, request);
			} else {// JSON格式返回
				try {
					System.out.println("------------------------------>>>enter into json " + ex.getMessage());
					PrintWriter writer = response.getWriter();
					System.out.println("------------------------------>>> " + ex.getMessage());
					writer.write(ex.getMessage());
					writer.flush();
				} catch (IOException e) {
					System.out.println("------------------------------>>> <<<--------------------------");
					e.printStackTrace();
				}
				return null;

			}
		} else {
			return null;
		}
	}
}


所以,有效的解决了sql注入。网上还有的方法更直接,就是过滤器过滤直接粘过来:

配置拦截器

<!‐‐ 拦截器配置‐‐>
<mvc:interceptors>
<!‐‐ SQL注入拦截‐‐>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.data.job.util.interceptor.SqlInjectInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
/**
* 防止SQL注入的拦截器
*
* @author tyee.noprom@qq.com
* @time 2/13/16 8:22 PM.
*/
public class SqlInjectInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String[] values = request.getParameterValues(name);
for (String value : values) {
value = clearXss(value);
}
}
/**
* 处理字符转义
*
* @param value
* @return
*/
private String clearXss(String value) {
if (value == null || "".equals(value)) {
return value;
}
value = value.replaceAll("<", "<").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replace("\\)", ")");
value = value.replaceAll("'", "'");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']",
"\"\"");
value = value.replace("script", "");
return value;
}



黄金分割线

===================================================================================================================

自己项目的代码

@ResponseBody
	@RequestMapping(value = "login.htm")
	public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) {
		boolean result = false;
		IMap _staffMap = new IMap();
		IMap params = new IMap(request);

IMap封装了HashMap,以下封装代码:

// 从页面获取数据
	public IMap(HttpServletRequest request) {
		this.request = request;
		// 返回值Map
		returnMap = new HashMap<String, Object>();
		// 参数Map
		//@SuppressWarnings("unchecked")
		@SuppressWarnings("unchecked")
		Map<String, String[]> properties = request.getParameterMap();
		Set<Map.Entry<String, String[]>> entrySet = properties.entrySet();
		for (Map.Entry<String, String[]> entry : entrySet) {
			String key = (String) entry.getKey() == null ? null : convert2Decode((String) entry.getKey(), charset);
			Object valueObj = entry.getValue();
			String value = "";
			if(null == valueObj){
				value = "";
			}else if(valueObj instanceof String[]){
				String[] values = (String[])valueObj;
				for(int i=0;i<values.length;i++){
					value = values[i].trim();
					if (request.getMethod().equalsIgnoreCase("get")) {
						value = values == null ? null : convert2Character(value, charset);
					}
					value = values == null ? null : convert2Decode(value, charset) + ",";
				}
				value = value.substring(0, value.length()-1);
			}else{
				value = valueObj.toString();
			}
			returnMap.put(key, value);
		}
	}

private static String convert2Decode(String target, String charset){
		try {
			System.out.println("---------URLDecoder处理前:--------" + target +"--->处理后===" + URLDecoder.decode(target, charset));
			return URLDecoder.decode(target, charset);
		} catch (UnsupportedEncodingException e) {
			return target;
		}
	}
	
	public String convert2Character(String target, String charset) {
        System.out.println("编码转换之前:" + target);
        try {
            return new String(target.trim().getBytes("ISO-8859-1"), charset);
        } catch (UnsupportedEncodingException e) {
        	e.printStackTrace();
            return target;
        }
    }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

封装HashMap加入URLdecoder解码器,防注入 的相关文章

  • ffmpeg--使用命令+EasyDarwin推流笔记本摄像头

    手头没有网络摄像头 采用ffmpeg EasyDarwin 笔记本摄像头模拟一个网络摄像头用来开发程序 有一些小细节记录一下 EasyDarwin安装使用 流媒体服务器easydarwin的安装还是非常方便的 参考官方给的readme 几分
  • 三层架构实现增删改查操作封装

    文章目录 概要 整体架构流程 技术名词解释 技术细节 小结 概要 三层架构 三层架构分为 数据 dao 层 业务 service 层 控制 controller 层 1 表示层 USL 即User Show Layer 视图层 a 前台 对
  • 学习材料收集

    记一个好帖子 http www wowotech net
  • 一个例子让你看清线程调度的随机性

    粉丝提问 c语言 如何定义一个和库函数名一样的函数 并在函数中调用该库函数 一个端口号可以同时被两个进程绑定吗 两个线程 两个互斥锁 怎么形成一个死循环 一个例子让你看清线程调度的随机性 线程调度的几个基本知识点 多线程并发执行时有很多同学
  • 【STM32】中断向量表

    我是通过这个进行学习的 我觉得讲的很好 这里我稍加修改 作为自己的学习笔记 嵌入式杂谈之中断向量表 前言 STM32根据boot引脚的配置方式有3种启动方式 但是无论哪一种方式 对于STM32来说都是从0x0000 0000启动 STM32
  • Ubuntu18下载安装IDEA最新版

    下载地址 官网地址 下载 选择功能更强大的一版 点击UItimate下面的Download 保存 TAR GZ压缩文件 解压到 opt文件下 找到压缩文件所在的文件夹 右键在终端打开 输入下面代码 记得改成自己文件包的名字 sudo tar
  • Spring之底层架构核心概念解析

    目录 一 BenDefinition 二 Spring定义Bean的方式 三 BeandefinitionReader 四 AnnotatedBeandefinitionReader 五 XmlBeanDefinitionReader 六

随机推荐

  • 修改NuGet包默认存放位置

    默认情况下 NuGet下载的包存放在系统盘 C盘中 这样一来 时间长了下载的包越多 C盘占用的空间也就越多 1 问题描述 默认情况下 NuGet下载的包存放在系统盘 C盘中 一般在路径C Users 用户 nuget packages下 这
  • 2021-05-23unity【OnEnable,  OnDisable,  OnDestroy】(这是三个方法函数)-(声明方法即可)(常用于设置游戏结束运行后的状态)   

    3 OnEnable OnDisable OnDestroy 这是三个方法函数 声明方法即可 常用于设置游戏结束运行后的状态 OnEnable 当对象变为可用或激活状态时 此函数被调用 注 这里的对象指的是 挂有该脚本的对象 OnDisab
  • python基于字典多线程目录枚举工具

    基于字典多线程目录枚举工具 整体思路 命令行参数获取 字典文件的读取 多线程访问 命令行参数获得 使用模块 sys getopt sys argv获取命令行执行的数据 参数获得 opt args getopt getopt sys argv
  • SQL group by和count

    group by 使用时具体看右边是要统计什么 统计什么就具体把那一列得数据给贴上去和左边对应 不使用聚合函数直接group by 分组 只截取对应分组第一行数据 group by可以通过逗号用多个字段进行分组 group by 字段1 字
  • 遇到问题之-centos安装配置hadoop超详细过程(含故障排除)

    1 集群部署介绍 1 1 Hadoop简介 201205161427003307 png Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 以Hadoop分布式文件系统 HDFS Hadoop Distributed Fil
  • 个人对智能家居平台选择的思考

    本人之前开发过不少MicroPython程序 其中涉及到自动化以及局域网控制思路 也可以作为智能家居的实现方式 而NodeMCU ESPHome的方案具有方便添加硬件 容易更新程序和容量占用小的优势 本人也查看过相关教程后感觉部署ESPHo
  • 滤波器的主要参数

    一 3dB带宽定义和理解 3dB带宽指幅值等于最大值的二分之根号二倍时对应的频带宽度 幅值的平方即为功率 平方后变为1 2倍 在对数坐标中就是 3dB的位置了 也就是半功率点了 对应的带宽就是功率在减少至其一半以前的频带宽度 表示在该带宽内
  • 面试题亲身经历

    1 什么是浅拷贝和深拷贝有什么区别 1 浅拷贝只是复制了对象的引用地址 两个对象指向同一个内存地址 所以修改其中任意的值 另一个值都会随之变化 这就是浅拷贝 例 assign 2 深拷贝是将对象及值复制过来 两个对象修改其中任意的值另一个值
  • PPP协议使用同步传输技术传送比特串0110111111111100。试问经过零比特填充后变成怎样的比特串?若接收端收到的PPP帧的数据部分是0001110111110111110110,问删除发送端

    比特填充法的具体做法是 在发送端 当一串比特流尚未加上标志字段时 先用硬件扫描整个帧 只要发现5个连续1 则立即填入一个0 因此经过这种零比特填充后的数据 就可以保证不会出现6个连续1 在接收一个帧时 先找到F字段以确定帧的边界 接着再用硬
  • ADIDAS阿里纳斯励志广告语

    系列文章目录 精选优美英文短文1 Dear Basketball 亲爱的篮球 精选优美英文短文2 Here s to the Crazy Ones 致疯狂的人 我祝你不幸并痛苦 约翰 罗伯茨毕业致辞 亲爱的波特兰 CJ麦科勒姆告别信 Hi
  • 你现在是一名博主,你要写关于chatgpt的文章,有哪些独特见解,写500字

    作为一名 AI 模型 ChatGPT 的独特之处在于它能够生成高质量的文本内容 并且具有很强的语言理解能力 首先 ChatGPT 是一种基于 Transformer 架构的语言模型 它通过大量的训练数据学习了语言的知识和结构 这使得它能够生
  • 运放积分器为什么要在电容两端并联一个电阻,阻值怎么计算

    本文摘自 新概念模拟电路 对于积分电路 在实际应用中 因为存在输入失调电压 输入偏置电流 会导致会有一个持续电流流过反馈电容 使电容上的电压累积增加或者减小 最终达到最大输出电压 上图很好的解释了给电容充电的原因 为了避免这种现象 一般在电
  • LVGL V8之flex布局item反序排列

    flex布局实现 static void lv example flex 4 void lv obj t cont lv obj create lv scr act 当前活动界面上创建obj对象 lv obj set size cont 3
  • 说说SFINAE

    文章目录 SFINAE简介 SFINAE的一个例子 使用C 11进行代码简化 对于c 11代码的解说 大后天就是除夕了 牛年将过 虎年马上来了 以一篇关于C 的非常小众的文章作为牛年的结尾 若有讲的不清楚或讲错的地方欢迎大家留言指出来 为什
  • tcl加载tcom扩展包的一个实例

    函数名 readconfig 输入参数 无 返回参数 返回一个列表 proc readconfig package require tcom 创建com实例 set excel tcom ref createobj Excel Applic
  • 服务器启动显示message,DNS服务器中的message日志出现一些信息,看不懂,请大家帮我看看!!...

    DNS服务器中的message日志出现一些信息 看不懂 请大家帮我看看 2012 01 03 00 34 46 标签 服务器 信息 message 杂谈 DNS服务器中的message日志出现一些信息 看不懂 请大家帮我看看 主要是发现DN
  • flutter iOS 缺少通知权限,缺少位置权限

    App Store Connect 亲爱的开发者 我们发现了一个或多个问题与您的应用程序 hayya附近的朋友Chat Meet 1 0 3 1 最近的交付 您的交付是成功的 但您可能希望在您的下一次交付纠正以下问题 ITMS 90078
  • docker问题笔记--前端容器更新失败

    问题描述 情况是这样的 今天由于项目需要 更新了前端容器 但是重启之后发现还是旧的前端 一时间有点迷惑 我的更新方式是为了图省事 并没有用新的前端镜像去重新起一个容器 而是直接用dist文件夹内容替换前端容器中的frontend文件夹内容
  • 在vue项目中引入jssdk所遇到的各种问题

    由于在最近的项目中 需要用到扫一扫二维码签到的功能 在纯H5的页面中要实现这个是不太可能的 所以考虑用jssdk或者混合开发 由于没有微信公众号和混合开发的经验 混合开发不太现实 公司没有考虑这个 而jssdk有其他公众号平台的公司配合 所
  • 封装HashMap加入URLdecoder解码器,防注入

    其中URLDecoder decode有个好处 就是防止 sql注入 当然对其他字符无效了 当在input输入用户名时候 10001 经过后台先获取 并解码 会报错 package test import java io Unsupport