`
newleague
  • 浏览: 1500879 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

慎用StringEscapeUtils.escapeHtml方法【转】

 
阅读更多

推荐使用Apache commons-lang的StringUtils来增强Java字符串处理功能,也一直在项目中大量使用StringUtils和StringEscapeUtils这两个实用类。

最近在数据库里发现某个表的内容全都成了HTML entity表示,中文也全被转换成了”我”这样的格式,而在页面上显示一切正常。最终发现造成这个后果的原因是在将字符串保存到数据库之前,用StringEscapeUtils.escapeHtml对其进行了处理。

字符串过滤是在许多Web应用开发中需要考虑的问题。比如用户输入一个左尖括号(<),在输出HTML代码对其进行显示的话,应该用”&lt;”来表示。是在用户将表单提交后就做转换呢,还是在从数据库取出内容向用户展示时再转换?这个问题需要仔细考虑。在入库前转换,看似一劳永逸,然而如果用户需要编辑这个内容,你需要原路退回,做个逆向的转换,这看起来比较麻烦。所以大部分的转换都是在从数据库中取出数据之后做的,struts的bean:write标签 的filter属性就是控制这个开关的(默认为true)。

而某些内容是不会被编辑的,比如一般的电子邮件,这类就可以在用户提交表单之时转换,一劳永逸。于是我使用了StringEscapeUtils.escapeHtml来做这个工作。

如果是英文内容,没有任何问题,然而它将一个中文字符转换成了8个字符。在UTF-8的编码 中,每个汉字占用三个字节,每个英文字符占用一个字节。这样的转换造成了大量的空间浪费。

简单的办法是自己写一个escapeHtml方法,替换左右尖括号就可以了。虽然还有一些HTML entity未被转换,可能造成输出的网页不符合web标准,但是大部分浏览器都可以正常显示也就够了。

 

对要输出的网页内容编码,网上搜的方法。

public static String htmlEncode(String source) {
        if (source == null) {
            return "";
        }
        String html = "";
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < source.length(); i++) {
            char c = source.charAt(i);
            switch (c) {
            case '<':
                buffer.append("&lt;");
                break;
            case '>':
                buffer.append("&gt;");
                break;
            case '&':
                buffer.append("&amp;");
                break;
            case '"':
                buffer.append("&quot;");
                break;
            case 10:
            case 13:
                break;
            default:
                buffer.append(c);
            }
        }
        html = buffer.toString();
        return html;
    }
分享到:
评论

相关推荐

    org.apache.commons.lang.StringEscapeUtils

    解决json数据中,返回的数据格式中带有反斜杠 如下所示{\"Count\":\"3\",\"ErrorString\":\"\",\"Success\":true,\"URL\":\"http:\\\/\\\/172.16.80.65:8080\\\/LoginSSO.aspx?UserCode=wubg&Type=WorkItem\",\...

    Spring-MVC处理XSS、SQL注入攻击的方法总结

    例如,可以使用 `StringEscapeUtils.escapeSql()` 方法来转义 SQL 注入攻击中的危险字符,使用 `StringEscapeUtils.escapeHtml()` 或 `StringEscapeUtils.escapeJavaScript()` 来转义可能引发 XSS 攻击的字符。...

    字符串的encode/escape

    在这个例子中,`URLEncoder.encode()`用于URL编码,`StringEscapeUtils.escapeHtml4()`用于HTML转义,然后分别有对应的解码和unescape方法。运行这段代码,你会看到原始字符串如何经过编码和转义,以及如何恢复到...

    commons-lang3-3.1_jar

    2. **HTML转义**:`StringEscapeUtils.escapeHtml4(String input)`方法处理HTML的特殊字符,例如将 `转义为 `,防止HTML注入攻击。 3. **JavaScript转义**:`StringEscapeUtils.escapeJavaScript(String input)`...

    基于java+SpringBoot+Mybatis博客论坛交流平台网毕业设计源码+数据库+使用文档(高分优秀项目).zip

    该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到97分,在window10/11测试环境严格调试,下载即用,确保可以运行,部署教程齐全,也可以作为课程设计 基于java+SpringBoot+Mybatis博客...

    详解json串反转义(消除反斜杠).docx

    下面将详细介绍其中一种简便的方法——使用 Apache Commons Lang 库中的 `StringEscapeUtils.unescapeJavaScript()` 方法。 #### 4. 使用 Apache Commons Lang 库进行反转义 Apache Commons Lang 是一个非常实用的...

    MVel 2.0.15 doc

    `&lt;a href="@{ua.pageURI}"&gt;@{org.apache.commons.lang.StringEscapeUtils.escapeHtml(ua.name)}&lt;/a&gt;` 展示了如何调用静态方法。MVEL允许直接在模板中调用类的静态方法,如`StringEscapeUtils.escapeHtml()`,用于对`...

    escape.sql

    escape.sql

    commons-lang3-3.6.jar

    commons-lang可以将html转以后的...String convStr = StringEscapeUtils.unescapeHtml(str);//apache的jar包:commons-lang-*.jar可以将html转换的符号转换过来(网上抄来的) Sysout(convStr);//“!@#¥%……&——+”

    消除斜杠commons-lang3-3.12.0工具类.zip

    除了`unescapeJson()`,`StringEscapeUtils`还提供了其他有用的方法,如`escapeHtml()`、`unescapeHtml()`用于HTML转义和反转义,`escapeJava()`、`unescapeJava()`用于Java字符串的转义和反转义,以及`escapeXml()`...

    详解json串反转义(消除反斜杠)

    String tmp = StringEscapeUtils.unescapeJavaScript(str1); System.out.println("tmp: " + tmp); } ``` 运行这段代码会得到反转义后的字符串: ```java tmp: {"resourceId":"dfead70e4ec5c11e43514000ced0cdcaf...

    commons-lang3-3.4jar.rar

    1. **HTML转义**:`escapeHtml()` 和 `unescapeHtml()` 方法可以将字符串中的HTML特殊字符转换为它们的实体表示,如将 "转义为 "&lt;",防止XSS(跨站脚本攻击)。 2. **XML转义**:`escapeXml()` 和 `unescapeXml...

    在Java中轻松将HTML格式文本转换为纯文本(保留换行)

    第一步:引入Jsoup和lang和lang3的依赖: Jsoup是HTML解析器 lang和lang3这两个包里...import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; im

    Struts2-007简单分析1

    为了修复这个漏洞,Apache Struts在后续版本中引入了安全措施,如使用`StringEscapeUtils.escape()`对用户输入进行转义,防止命令执行。这使得字符串不再直接参与OGNL表达式的执行,而是经过转义处理,降低了攻击的...

    常用字符串操作的实现方式

    1、 转义特殊字符:String escaped = StringEscapeUtils.escapeJava("Hello\nWorld"); 输出结果:"Hello\\nWorld" 2、 反转义:String unescaped = StringEscapeUtils.unescapeJava(escaped); 输出结果:"Hello\...

    XSS防攻击实现

    text = StringEscapeUtils.escapeHtml4(text); } super.setValue(text); } } ``` 然后在Controller中使用`@InitBinder`注解注册这个编辑器: ```java @Controller public class MyController { @InitBinder ...

    java防止xss注入.rar 附案例及jar包

    例如,使用`StringEscapeUtils.escapeHtml4()`方法来自Apache Commons Lang库。 3. **使用HTTPOnly Cookie**:设置Cookie的HTTPOnly属性,可以防止JavaScript访问该Cookie,从而降低XSS攻击窃取会话信息的风险。 4...

    domino xpages 显示双引号

    在Java中,可以使用`java.net.URLEncoder.encode()`方法,但请注意,URLEncoder通常用于URL编码,对于HTML实体可能不是最佳选择,更好的方法是使用`java.lang.StringEscapeUtils.escapeHtml()`。 7. **CSS引用**: ...

    看例子练apache_commons之lang篇

    - **StringEscapeUtils.escapeHtml4()**: 转义HTML字符。 - **StringEscapeUtils.unescapeHtml4()**: 去转义HTML字符。 #### 九、StringUtils 的应用 `StringUtils` 类提供了大量的字符串处理方法。 - **...

    java 预防XSS攻击

    - 对HTML元素和属性使用HTML实体编码,例如使用`org.apache.commons.lang3.StringEscapeUtils.escapeHtml4()`。 - 对URL和JavaScript使用相应的编码,如`encodeURIComponent()`。 - 如果使用模板引擎,如...

Global site tag (gtag.js) - Google Analytics