- 浏览: 665667 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (173)
- ajax (4)
- ant (4)
- css (14)
- eclipse (1)
- exe4j (0)
- hibernate (7)
- html (29)
- http (2)
- install4j (0)
- java (35)
- javascript (31)
- jdbc (1)
- jquery (2)
- jsp (15)
- linux命令 (8)
- ooad (2)
- properties (3)
- servlet (1)
- spring (3)
- struts (6)
- swing (4)
- thread (2)
- version_control (1)
- webservice (4)
- xml (4)
- 数据库 (19)
- 正则表达式 (5)
- 其他 (16)
- 面试题 (1)
- 框架 (9)
- maven (1)
- util (29)
- 设计模式 (1)
最新评论
-
herodie4444:
看起来好像不难。
Java Struts2创建Excel文件并实现文件下载 -
心轨翼:
Java遍历Set集合方法 -
魔鬼的献祭:
...
java的web开发分页工具类 -
Nmxszxsl:
能发一个没有被墙的代码到我的邮箱吗?万分感谢。54365156 ...
Google翻译post提交无长度限制的在线翻译例子 -
782763595:
...
jar包混淆器介绍
避免XSS跨站漏洞的方法之一主要是将用户所提交的内容输入输出进行过滤,包括请求路径过滤与参数过滤。这里,我写一个过滤器专门处理XSS跨站漏洞,思路是将带有非法字符的请求转发到一个指定页面,将参数的非法字符过滤去除。
过滤器代码如下:
在xml文件中声明过滤器,配置过滤器链
重写HttpServletRequest,覆盖一些方法
最后,给个页面表单例子:
参考网址:
http://yunjiechao-163-com.iteye.com/blog/1973803
http://www.cnblogs.com/wuhuacong/archive/2013/04/15/3022011.html
过滤器代码如下:
package com.eshore.itmp.model.web.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.regex.Pattern; import javax.servlet.FilterChain; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.filter.OncePerRequestFilter; /** * XSS漏洞过滤器 * * @author ahomeeye * */ public class XssFilter extends OncePerRequestFilter { private static Log logger = LogFactory.getLog(XssFilter.class); private String forwardUrl = "/login.jsp"; @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { String uri = req.getRequestURI(); logger.info("-------uri=" + uri); // 过滤请求的参数名和参数值 XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper( (HttpServletRequest) req); if (uri.contains("j_spring_security_check") && isContainSpecialChar(uri)) {// 判断uri是否合法 logger.info("-------uri包含特殊字符 uri=" + xssRequest.getRequestURI()); RequestDispatcher dispatcher = xssRequest .getRequestDispatcher(forwardUrl); dispatcher.forward(xssRequest, res); } else { filterChain.doFilter(xssRequest, res);// 执行其他过滤操作 } } /** * 判断字符串是否包含特殊字符 * * @param strVal * @return */ public boolean isContainSpecialChar(String value) { String strVal = ""; try { strVal = URLDecoder.decode(value, "UTF-8"); } catch (UnsupportedEncodingException e) { logger.error("URL解码错误", e); } boolean flag = false; if (match(".*?<script\\b.*?>*?</script>.*?", strVal)) {// //匹配js脚本字符串 flag = true; } else if (match(".*?<.*?>.*?", strVal)) {// 匹配html标签字符串 flag = true; } return flag; } /** * 匹配正则表达式,大小写不敏感 * * @param regex * @param input * @return */ public boolean match(String regex, CharSequence input) { Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); return p.matcher(input).matches(); } public String getForwardUrl() { return forwardUrl; } public void setForwardUrl(String forwardUrl) { this.forwardUrl = forwardUrl; } }
在xml文件中声明过滤器,配置过滤器链
<beans:bean id="xssFilter" class="com.eshore.itmp.model.web.security.XssFilter" p:forwardUrl="/login.jsp"> </beans:bean> <beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <filter-chain-map path-type="ant"> <filter-chain pattern="/kaptcha.validate" filters="none" /> <filter-chain pattern="/services/**" filters="none" /> <filter-chain pattern="/media/**" filters="none" /> <filter-chain pattern="/css/**" filters="none" /> <filter-chain pattern="/images/**" filters="none" /> <filter-chain pattern="/js/**" filters="none" /> <filter-chain pattern="/page/**" filters="none" /> <filter-chain pattern="/My97DatePicker/**" filters="none" /> <filter-chain pattern="/login.jsp" filters="none" /> <filter-chain pattern="/phytopo/**" filters="none" /> <filter-chain pattern="/relationView/**" filters="none" /> <!-- add --> <filter-chain pattern="/oaLogin.do" filters="none" /> <filter-chain pattern="/selection/**" filters="none" /> <filter-chain pattern="/entity/**" filters="none" /> <filter-chain pattern="/upload/**" filters="none" /> <filter-chain pattern="/assessmentKpi/getExcelData.do**" filters="none" /> <!-- add --> <filter-chain pattern="/logoutSuccess.jsp" filters="none" /> <filter-chain pattern="/**" filters=" xssFilter, securityContextPersistenceFilter, logoutFilter, usernamePasswordAuthenticationFilter, anonymousAuthenticationFilter, exceptionTranslationFilter, itmpCustomInterceptor, sysLogFilter" /> </filter-chain-map> </beans:bean>
重写HttpServletRequest,覆盖一些方法
package com.eshore.itmp.model.web.security; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * 请求参数过滤器(修复跨站脚本漏洞) * * @author ahomeeye * */ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { HttpServletRequest orgRequest = null; public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); orgRequest = request; } /** * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/> * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/> * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖 */ @Override public String getParameter(String name) { String value = super.getParameter(xssEncode(name)); if (value != null) { value = xssEncode(value); } return value; } @Override public Object getAttribute(String name) { Object value = super.getAttribute(xssEncode(name)); if (value instanceof String) { return xssEncode(value.toString()); } return value; } /** * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/> * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> * getHeaderNames 也可能需要覆盖 */ @Override public String getHeader(String name) { String value = super.getHeader(xssEncode(name)); if (value != null) { value = xssEncode(value); } return value; } @Override public String getRequestURI() { String strVal = ""; try { strVal = URLDecoder.decode(super.getRequestURI(), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String value = xssEncode(strVal); if (value != null) { value = xssEncode(value); } return value; } public String escape(String s) { StringBuilder sb = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '>': sb.append('>');// 全角大于号 break; case '<': sb.append('<');// 全角小于号 break; case '\'': sb.append('‘');// 全角单引号 break; case '\"': sb.append('“');// 全角双引号 break; case '\\': sb.append('\');// 全角斜线 break; case '%': sb.append('%'); // 全角冒号 break; case ';': sb.append(';'); // 全角分号 break; default: sb.append(c); break; } } return sb.toString(); } /** * 将容易引起xss漏洞的半角字符直接替换成全角字符 * * @param s * @return */ public String xssEncode(String s) { if (s == null || s.isEmpty()) { return s; } String result = stripXSS(s); if (null != result) { result = escape(result); } return result; } private String stripXSS(String value) { if (value != null) { // NOTE: It's highly recommended to use the ESAPI library and // uncomment the following line to // avoid encoded attacks. // value = ESAPI.encoder().canonicalize(value); // Avoid null characters value = value.replaceAll("", ""); // Avoid anything between script tags Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Avoid anything in a src='...' type of expression scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome </script> tag scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome <script ...> tag scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); // Avoid eval(...) expressions scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); // Avoid expression(...) expressions scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); // Avoid javascript:... expressions scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Avoid vbscript:... expressions scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Avoid onload= expressions scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("<iframe>(.*?)</iframe>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("</iframe>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome <script ...> tag scriptPattern = Pattern.compile("<iframe(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); value = value.replace(";", ""); value = value.replace("<", ""); value = value.replace(">", ""); } return value; } /** * 获取最原始的request * * @return */ public HttpServletRequest getOrgRequest() { return orgRequest; } @Override public HttpServletRequest getRequest() { return orgRequest; } /** * 获取最原始的request的静态方法 * * @return */ public static HttpServletRequest getOrgRequest(HttpServletRequest req) { if (req instanceof XssHttpServletRequestWrapper) { return ((XssHttpServletRequestWrapper) req).getOrgRequest(); } return req; } }
最后,给个页面表单例子:
<script type="text/javascript"> function setPass(originId,decId){ var orginName = window.parent.document.getElementById('orginName').value; var newName = strEnc(orginName,'itmp','des','encrypt'); window.parent.document.getElementById('userId').value = newName; var orginPass = window.parent.document.getElementById(originId).value; var newPass = strEnc(orginPass,'itmp','des','encrypt'); //alert('newPass=' + newPass + ' pass='+strDec(newPass,'itmp','des','encrypt')); window.parent.document.getElementById(decId).value = newPass; } </script> <form id="form" name="form" action="${ctx}/j_spring_security_check" method="post"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="20%" height="10" class="black14" align="center" valign="middle"></td> <td colspan="2" align="left"> <div class="error${param.error==true?'':'hide'}" style="color:red;"> ${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message} </div> </td> </tr> <tr> <td width="20%" height="35" class="black14">用户名</td> <td colspan="2" align="left"><label > <input type="text" id="orginName" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" class="input" /> <input type="hidden" id="userId" name="j_username" value="" class="input"/> </label></td> </tr> <tr> <td height="35" class="black14">密 码</td> <td colspan="2" align="left"><label > <input type="password" id="orginPass" class="input" onblur="setPass('orginPass','password');"/> <input type="hidden" name="j_password" id="password" class="input"/> </label></td> </tr> <tr> <td height="35" class="black14">验证码</td> <td width="37%" align="left"><label> <input type="text" name="validateCode" class="input2"/> </label></td> <td width="43%" align="left"> <img onclick="this.src='kaptcha.validate'" src="kaptcha.validate" width="77" height="28" /> </td> </tr> <tr> <td height="93" colspan="3" align="center"> <a href="#"> <input type="image" src="${ctx}/css/remake/images/button_login.gif" width="111" height="36" border="0" /> </a> </td> </tr> </table> </form>
参考网址:
http://yunjiechao-163-com.iteye.com/blog/1973803
http://www.cnblogs.com/wuhuacong/archive/2013/04/15/3022011.html
发表评论
-
java读取.properties配置文件的几种方法
2017-09-22 09:38 678读取.properties配置文件在实际的开发中使用的很多,总 ... -
java前后台字符串编码转换
2016-12-15 15:52 807此文为应用中遇到字符串编码转换问题网上找资料解决问题记录笔记, ... -
JavaScript replace字符串替换函数的用法
2016-10-19 15:21 879replace 语法 stringObj.replace(rg ... -
JS前端DES加密参数
2016-07-08 14:27 11739DES加密为可解密的机制,这里使用DES进行加密方便后台解密还 ... -
hibernate的clob数据处理
2014-05-21 17:11 1126hibernate的clob数据处理: import or ... -
java设计模式笔记链接地址汇总
2012-12-25 12:02 1088这是iteye博客用户的iulve-rover-163-com ... -
java枚举类型(转)
2012-12-24 18:34 4977public class TestEnum { ... -
内存溢出
2012-11-21 11:07 11251.PermGen space的全称是Permanent Ge ... -
转 js中数据类型判断(转)
2012-11-05 11:07 1145转载自: http://www.cnblogs.com/yjh ... -
日期比较例子
2012-10-16 15:30 1221/** * 时间日期比较处理例子 * @autho ... -
Struts2的简单示例action类
2012-09-26 19:57 4695基类: package com.kit.common; ... -
Java过滤html标签
2012-09-21 09:54 1816方法一: String oldStr="< ... -
Web项目设置页面不缓存
2012-08-04 19:55 2898htm网页 <meta http-equiv=&qu ... -
Java文件保存与删除工具类
2012-07-26 15:46 4357import java.io.File; import ... -
使用AOP实现监控日志并保存
2012-07-13 20:42 6013最近项目中要做个效能监控的功能,经过考虑,觉得选择spring ... -
POI兼容读取Excel2003和Excel2007
2012-06-29 16:00 9461import java.io.File; import ... -
登录验证过滤器Filter
2012-06-01 14:30 1611import java.io.IOException; ... -
java Web常用基本操作代码
2011-12-30 10:23 34501.Struts2中文件保存 //设置文件的三个属性,并 ... -
Eclipse或MyEclipse中如何恢复已删除文件(转)
2011-12-24 18:44 1534今天在MyEclipse鼠标点得太快,误删了一个花了两天才写好 ... -
POI读取Excel的Integer数值
2011-12-08 19:38 1873// 取得当前Cell的数值 Integer num ...
相关推荐
基于Php语言设计并实现了微信小程序的社区门诊管理系统。该小程序基于B/S即所谓浏览器/服务器模式,选择MySQL作为后台数据库去开发并实现一个以微信小程序的社区门诊为核心的系统以及对系统的简易介绍。 用户注册,在用户注册页面通过填写账号、密码、确认密码、姓名、性别、手机、等信息进行注册操作; 用户登录,用户通过登录页面输入账号和密码,并点击登录进行小程序登录操作。 用户登陆微信端后,可以对首页、门诊信息、我的等功能进行详细操作 门诊信息,在门诊信息页面可以查看科室名称、科室类型、医生编号、医生姓名、 职称、坐诊时间、科室图片、点击次数、科室介绍等信息进行预约挂号操作 检查信息,在检查信息页面可以查看检查项目、检查地点、检查时间、检查费用、账号、姓名、医生编号、医生姓名、是否支付、审核回复、审核状态等信息进行支付操作
白色大气风格的设计师作品模板下载.zip
工程经济学自考必备软件下载
UML课程设计报告.doc
白色大气风格响应式彩绘精品水果网站模板.zip
白色简洁风格的别墅整站网站模板.zip
白色简洁风格的APP展示动态源码下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的雪山旅游景区CSS3网站模板.zip
介绍 基于python开发的大模型调用基础框架(源码) 使用说明 修改配置文件 cd config vim __init__.py # 在配置文件中添加大模型调用地址,模型名称,API_KEY等配置 启动应用 应用启动分为两种模式,命令行模式和web模式 命令行模式 python main.py cli web模式 python main.py api
基于JavaWeb的小区物业管理系统源代码+数据库 负责数据库的设计和界面的设计和实现; 界面使用 BootStrap 框架,页面自适应效果,修改页面后实现各个功能模块的布局; 负责实现用户登录注册,查看小区活动公告、水电费查询、车费查询信息; 采用的技术:采用 MVC 架构,数据库用 MySql;
白色简单风格的商务企业网站模板下载.zip
1. 平台在家电和电子产品方面的营运情况如何? 2. 哪些品牌和类别销量最高? 3. 用户消费规律 4. 哪些是我们的重点用户? 5. 平台有哪些优势和不足,需要如何改进?
全平台数据库管理工具, 支持 ClickHouse, Presto, Trino, MySQL, PostgreSQL, Apache Druid, ElasticSearch...
白色大气风格的旅游整站网站模板.zip
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
白色大气风格的红唇少女女性类网站模板.zip
白色简洁风格的UIDesign设计公司企业网站模板.rar
Linux期末考试试题.doc