当前位置:  开发笔记 > 编程语言 > 正文

在Java中转义HTML的推荐方法

如何解决《在Java中转义HTML的推荐方法》经验,为你挑选了10个好方法。

有没有逃脱推荐的方法<,>,"&字符在普通的Java代码输出HTML时?(除了手动执行以下操作外,即).

String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...

dfa.. 257

来自Apache Commons Lang的StringEscapeUtils:

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
// ...
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = escapeHtml(source);

对于版本3:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);

上面的例子被打破了.现在使用escapeHtml4()方法. (21认同)

对于番石榴粉丝,请参阅下面的[okranz的回答](http://stackoverflow.com/a/26572556/245602). (3认同)

它现在已在commons-lang3中弃用.它被移至https://commons.apache.org/proper/commons-text/ (3认同)

虽然`StringEscapeUtils`很好,如果你想避免HTML/XML空格规范化,它不会正确地为属性转义空格.请参阅我的答案以获取更多细节 (2认同)

如果网页具有UTF-8编码,那么我们所需要的只是Guava的htmlEscaper,只能转义以下五个ASCII字符:'"&<>.Apache的escapeHtml()也替换非ASCII字符,包括UTF-8 web似乎不必要的重音符号页面? (2认同)


Adamski.. 129

Apache Commons的替代方案:使用Spring的HtmlUtils.htmlEscape(String input)方法.



1> dfa..:

来自Apache Commons Lang的StringEscapeUtils:

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
// ...
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = escapeHtml(source);

对于版本3:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);


上面的例子被打破了.现在使用escapeHtml4()方法.
对于番石榴粉丝,请参阅下面的[okranz的回答](http://stackoverflow.com/a/26572556/245602).
它现在已在commons-lang3中弃用.它被移至https://commons.apache.org/proper/commons-text/
虽然`StringEscapeUtils`很好,如果你想避免HTML/XML空格规范化,它不会正确地为属性转义空格.请参阅我的答案以获取更多细节
如果网页具有UTF-8编码,那么我们所需要的只是Guava的htmlEscaper,只能转义以下五个ASCII字符:'"&<>.Apache的escapeHtml()也替换非ASCII字符,包括UTF-8 web似乎不必要的重音符号页面?

2> Adamski..:

Apache Commons的替代方案:使用Spring的HtmlUtils.htmlEscape(String input)方法.


谢谢.我已经使用过它(而不是来自`apache-commons` 2.6的`StringEscapeUtils.escapeHtml()`),因为它保留了俄语字符.
很高兴知道.TBH这些天我给Apache的东西提供了很大的支持.

3> Bruno Eberha..:

很好的简短方法:

public static String escapeHTML(String s) {
    StringBuilder out = new StringBuilder(Math.max(16, s.length()));
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c > 127 || c == '"' || c == '<' || c == '>' || c == '&') {
            out.append("&#");
            out.append((int) c);
            out.append(';');
        } else {
            out.append(c);
        }
    }
    return out.toString();
}

基于/sf/ask/17360801/(放大器在那里丢失).根据http://www.w3.org/TR/html4/sgml/entities.html,if子句中检查的四个字符是128以下的唯一字符.



4> Martin Dimit..:

有一个较新版本的Apache Commons Lang库,它使用不同的包名(org.apache.commons.lang3).该StringEscapeUtils转义不同类型的文件,现在有不同的静态方法(http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html).所以要转义HTML 4.0版字符串:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;

String output = escapeHtml4("The less than sign (<) and ampersand (&) must be escaped before using them in HTML");


遗憾的是,HTML 5中没有任何内容,Apache文档也没有指定将escapeHtml4用于HTML 5是否合适.

5> okrasz..:

对于那些使用Google Guava的人:

import com.google.common.html.HtmlEscapers;
[...]
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = HtmlEscapers.htmlEscaper().escape(source);



6> OriolJ..:

在Android(API 16或更高版本)上,您可以:

Html.escapeHtml(textToScape);

或者用于较低的API:

TextUtils.htmlEncode(textToScape);


另请参阅我的[我的问题](http://stackoverflow.com/questions/35104032/whats-the-difference-between-androids-html-escapehtml-and-textutils-htmlencode),了解这两者之间的区别.(@Muz)

7> Jeff William..:

小心这个.HTML文档中有许多不同的"上下文":在元素内部,引用的属性值,不带引号的属性值,URL属性,javascript,CSS等...您需要为每个使用不同的编码方法这些是为了防止跨站点脚本(XSS).有关这些上下文的详细信息,请查看OWASP XSS Prevention备忘单 - https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet.您可以在OWASP ESAPI库中找到每个上下文的转义方法 - https://github.com/ESAPI/esapi-java-legacy.


感谢您指出您希望对输出进行编码的*context*非常重要.术语"编码"也是比"逃避"更合适的动词.Escape意味着某种特殊的hack,而不是"我如何编码*这个字符串:XHTML属性/ SQL查询参数/ PostScript打印字符串/ CSV输出字段?
'Encode'和'escape'都被广泛用于描述这一点.当进程要在语法相关的字符之前添加"转义字符"时,通常使用术语"转义",例如使用反斜杠转义引号字符\"术语"编码"更常用于翻译时将字符转换为不同的形式,例如将引号字符%22或HTML实体编码的URL编码为"或@quot.

8> 小智..:

出于某些目的,HtmlUtils:

import org.springframework.web.util.HtmlUtils;
[...]
HtmlUtils.htmlEscapeDecimal("&"); //gives &
HtmlUtils.htmlEscape("&"); //gives &



9> Adam Gent..:

虽然@dfa回答org.apache.commons.lang.StringEscapeUtils.escapeHtml很好并且我在过去使用它,但它不应该用于转义HTML(或XML)属性,否则空格将被规范化(意味着所有相邻的空白字符变成单个空格).

我知道这是因为我对我的库(JATL)提出了错误,因为没有保留空格的属性.因此,我有一个(复制n'粘贴)类(我从JDOM中窃取了一些),它区分了属性和元素内容的转义.

虽然这在过去可能没有那么重要(适当的属性转移),但是由于使用HTML5的data-属性使用,它越来越受到关注.



10> 小智..:

org.apache.commons.lang3.StringEscapeUtils现在已弃用。您现在必须使用org.apache.commons.text.StringEscapeUtils

    
        org.apache.commons
        commons-text
        ${commons.text.version}
    

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有