java web应用程序防止 csrf 攻击的方法,参考这里 java网页程序采用 spring 防止 csrf 攻击. ,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 XSS 攻击, XSS 攻击的专业解释,可以在网上搜索一下,参考百度百科的解释 http://baike.baidu.com/view/2161269.htm, 但在实际的应用中如何去防止这种攻击呢,下面给出几种办法.
1. 自己写 filter 拦截来实现,但要注意的时,在WEB.XML 中配置 filter 的时候,请将这个 filter 放在第一位.
2. 采用开源的实现 ESAPI library ,参考网址:https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
3. 可以采用spring 里面提供的工具类来实现.
一, 第一种方法。
配置过滤器
publicclassXSSFilterimplementsFilter{ @Override publicvoid init(FilterConfig filterConfig)throwsServletException{ } @Override publicvoid destroy(){ } @Override publicvoid doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throwsIOException,ServletException{ chain.doFilter(newXSSRequestWrapper((HttpServletRequest) request), response); }}
再实现 ServletRequest 的包装类
import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;publicclassXSSRequestWrapperextendsHttpServletRequestWrapper{ publicXSSRequestWrapper(HttpServletRequest servletRequest){ super(servletRequest); } @Override publicString[] getParameterValues(String parameter){ String[] values =super.getParameterValues(parameter); if(values ==null){ returnnull; } int count = values.length; String[] encodedValues =newString[count]; for(int i =0; i < count; i++){ encodedValues[i]= stripXSS(values[i]); } return encodedValues; } @Override publicString getParameter(String parameter){ String value =super.getParameter(parameter); return stripXSS(value); } @Override publicString getHeader(String name){ String value =super.getHeader(name); return stripXSS(value); } privateString 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("(.*?)",Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Avoid anything in a src="http://www.yihaomen.com/article/java/..." 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 tag scriptPattern =Pattern.compile("",Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome tag scriptPattern =Pattern.compile("",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(""); } return value; }}
例子中注释的部分,就是采用 ESAPI library 来防止XSS攻击的,推荐使用.
当然,我还看到这样一种办法,将所有的编程全角字符的解决方式,但个人觉得并没有上面这种用正则表达式替换的好
privatestaticString xssEncode(String s){ if(s ==null|| s.equals("")){ return s; } StringBuilder sb =newStringBuilder(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('\\'); sb.append('\''); sb.append('\\'); sb.append('\''); break; case'\"': sb.append('\\'); 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(); }
当然,还有如下更简单的方式:
privateString cleanXSS(String value){ //You'll need to remove the spaces from the html entities below value = value.replaceAll("<","& lt;").replaceAll(">","& gt;"); value = value.replaceAll("\\(","& #40;").replaceAll("\\)","& #41;"); value = value.replaceAll("'","& #39;"); value = value.replaceAll("eval\\((.*)\\)",""); value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']","\"\""); value = value.replaceAll("script",""); return value; }
在后台或者用spring 如何实现呢:
首先添加一个jar包:commons-lang-2.5.jar ,然后在后台调用这些函数:
StringEscapeUtils.escapeHtml(string);StringEscapeUtils.escapeJavaScript(string);StringEscapeUtils.escapeSql(string);
当然,我记得在spring 里面好像有一个 HtmlUtils.htmlEscape , 同样可以做到 过滤 XSS 攻击。从上面的介绍可以看出,防止 XSS 攻击并不难,就是要小心。
===============================================================
在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止sql注入,xss注入攻击的功能。总共提供了以下几个方法:
1.escapeSql 提供sql转移功能,防止sql注入攻击,例如典型的万能密码攻击' ' or 1=1 ' '
- StringBuffer sql = new StringBuffer("select key_sn,remark,create_date from tb_selogon_key where 1=1 ");
- if(!CommUtil.isEmpty(keyWord)){
- sql.append(" and like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'");
- }
StringBuffer sql = new StringBuffer("select key_sn,remark,create_date from tb_selogon_key where 1=1 "); if(!CommUtil.isEmpty(keyWord)){ sql.append(" and like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'"); }
2.escapeHtml /unescapeHtml 转义/反转义html脚本
- System.out.println(StringEscapeUtils.escapeHtml("<a>dddd</a>"));
- 输出结果为:<a>dddd</a>
System.out.println(StringEscapeUtils.escapeHtml("<a>dddd</a>")); 输出结果为:<a>dddd</a>
- System.out.println(StringEscapeUtils.unescapeHtml("<a>dddd</a>"));
- 输出为:<a>ddd</a>
System.out.println(StringEscapeUtils.unescapeHtml("<a>dddd</a>")); 输出为:<a>ddd</a>
3.escapeJavascript/unescapeJavascript 转义/反转义js脚本
- System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>"));
- 输出为:<script>alert('111')</script>
System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>")); 输出为:<script>alert('111')</script>
4.escapeJava/unescapeJava 把字符串转为unicode编码
- System.out.println(StringEscapeUtils.escapeJava("中国"));
- 输出为:用escapeJava方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A
==============================================
apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml,java等的转义与反转义,而且还能对关键字符串进行处理预防SQL注入,不过好像common-lang3.0以后我看着好像没这个处理SQL语句的方法了,想用的话前提时引入对应的jar包,以下为它的部分方法:
它的方法,全是静态,直接用类调用即可,下边来根据代码看看它们几个的用法和效果,一看一目了然:
- package stringescapeutils;
- import org.apache.commons.lang.StringEscapeUtils;
- public class StringEscapeUtilsTest {
- public static void main(String args[]){
- String sql="1' or '1'='1";
- System.out.println("防SQL注入:"+StringEscapeUtils.escapeSql(sql)); //防SQL注入
- System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml("<font>chen磊 xing</font>")); //转义HTML,注意汉字
- System.out.println("反转义HTML:"+StringEscapeUtils.unescapeHtml("<font>chen磊 xing</font>")); //反转义HTML
- System.out.println("转成Unicode编码:"+StringEscapeUtils.escapeJava("陈磊兴")); //转义成Unicode编码
- System.out.println("转义XML:"+StringEscapeUtils.escapeXml("<name>陈磊兴</name>")); //转义xml
- System.out.println("反转义XML:"+StringEscapeUtils.unescapeXml("<name>陈磊兴</name>")); //转义xml
- }
- }
输入结果:
- 防SQL注入:1'' or ''1''=''1
- 转义HTML,注意汉字:<font>chen磊 xing</font>
- 反转义HTML:<font>chen磊 xing</font>
- 转成Unicode编码:\u9648\u78CA\u5174
- 转义XML:<name>陈磊兴</name>
- 反转义XML:<name>陈磊兴</name>
http://blog.csdn.net/chenleixing/article/details/43456987
http://www.cnblogs.com/thinkpad/p/4837841.html
http://blog.csdn.net/joeyon1985/article/details/43527987
相关推荐
防止XSS攻击是保护Web应用安全的重要一环,对于任何Web开发者来说都是必备的知识。 一、XSS攻击类型 XSS攻击主要分为三类:反射型XSS、存储型XSS和DOM型XSS。 1. 反射型XSS:攻击者通过构造恶意链接,诱使用户点击...
通过这个项目,你可以学习到如何构建一个基础的Web应用,理解XSS攻击的原理,并学习如何在后端验证和清理用户输入,防止此类攻击的发生。同时,这也是一个很好的实践平台,加深对Node.js、Express以及JavaScript安全...
- **安全性**:CSP机制保护应用免受XSS攻击,同时还有白名单和黑名单机制控制访问权限。 - **调试支持**:内置的调试工具帮助开发者跟踪和调试DWR调用。 - **批量操作**:通过批处理,可以优化网络传输,减少HTTP...
12. **安全性**:了解常见的安全风险,如SQL注入、XSS攻击,使用预编译的PreparedStatement来防止SQL注入,对用户输入进行校验和过滤。 13. **模块化与依赖管理**:理解Maven或Gradle的依赖管理机制,合理组织项目...
本文将详细介绍如何使用过滤器(Filter)在JSP中有效地防止XSS攻击。 首先,我们需要了解XSS攻击的基本原理。当用户在Web表单中输入数据,这些数据未经适当的验证和编码直接显示在页面上时,攻击者可以通过注入恶意...
互联网安全架构-Web常用攻击手段之防盗链&防止CSRF模拟请求............12分布式解决方案-分布式配置中心-SpringBoot客户端整合Apollo分布式配置中心.......14-分布式解决方案-分布式锁解决解决方案-基于Redis方式...
XSS攻击可以根据不同的标准进行分类,但最常见的分类方式是根据恶意代码存储位置的不同,将其分为以下三种类型: 1. **反射型XSS** - 特征:这类攻击中的恶意代码不会被保存在服务器上,而是通过用户触发(例如...
- **CSRF与XSS防护**:通过添加令牌防止跨站请求伪造(CSRF)攻击,使用过滤和编码策略防止跨站脚本(XSS)攻击。 5. **权限管理** - **Session与Cookie**:Java中的Session和Cookie用于跟踪用户状态,实现登录...
安全性:对用户输入进行校验和转义,防止SQL注入、XSS攻击等。采用HTTPS传输数据,对敏感信息加密。 并发控制:理解并合理应用锁机制(如乐观锁、悲观锁),防止并发问题。 缓存策略:在合适的地方引入缓存机制...
10. **安全机制**:为保护用户数据安全,开发者需要考虑防止SQL注入、XSS攻击等,使用HTTPS加密传输,以及密码哈希存储等手段。 11. **测试与调试**:单元测试、集成测试是确保代码质量的重要步骤,JUnit和Mockito...
9. **安全配置**:防止DDoS攻击、XSS、CSRF等安全问题的措施。 【标签解析】 "nginx"对应Nginx服务器的使用和配置;"java"代表Java编程语言和其相关框架;"架构"涵盖了系统架构设计和优化;"运维"可能涉及服务器...
7. **安全机制**:包括用户认证(如JWT)、授权(角色权限管理)以及防止SQL注入和XSS攻击的安全措施。 8. **单元测试和集成测试**:JUnit或TestNG可能用于编写测试用例,确保代码的正确性和稳定性。 9. **版本...
10. **安全性**:包含了加密解密、权限控制、防止XSS、CSRF等攻击的安全编码原则,确保应用程序的安全性。 11. **性能优化**:提出了代码性能优化的策略,如避免过度设计、减少计算、使用缓存等,以提高程序运行...
在处理Web页面数据时,为了防止XSS攻击,通常需要对用户提交的数据进行HTML编码。 ```java public String htmlEncode(String txt) { txt = replace(txt, "&", "&"); txt = replace(txt, "\"", """); ...
1. **XSS防护**:防止跨站脚本攻击,对用户输入进行安全过滤。 2. **CSRF防护**:防止跨站请求伪造,确保用户操作的合法性。 3. **SQL注入防御**:使用预编译语句和参数化查询,避免SQL注入漏洞。 4. **密码加密**:...
Spring Security或Apache Shiro等框架可能被用来处理认证和授权,防止SQL注入、XSS攻击等安全风险。 7. **测试与部署**:单元测试、集成测试是保证代码质量的关键,JUnit和Mockito等工具可以帮助进行测试。部署方面...
此外,还需要注意安全性问题,比如防止SQL注入、XSS攻击等。 通过这个项目,学习者可以实践到如何将Java后端与前端、数据库紧密集成,实现一个完整的Web应用程序,并对SSM框架有深入的理解。同时,这也有助于提升...
这个`StringUtil`类提供了`trim`方法用于去除字符串两侧的空白字符,`replaceAll`方法用于全局替换字符串中的指定字符,以及`escapeHtml`方法用于转义HTML特殊字符,防止XSS攻击。 总结,Java编程中处理数据验证和...
HTML实体编码是防止跨站脚本(XSS)攻击的有效手段。在Java中,可以使用OWASP Java Encoder Project提供的工具进行正确的HTML编码,以防止恶意脚本在用户浏览器中执行。这个项目提供了一套API,使得开发者能轻松地对...
6. **安全性**:检查项目中是否包含了防止SQL注入、XSS攻击等安全措施,理解如何保护用户数据的安全。 7. **单元测试与集成测试**:查看是否存在JUnit或其他测试框架的代码,理解如何验证和保证代码质量。 通过...