我遇到过这个项目https://github.com/rwinch/spring-jackson-owasp/blob/master/spring-jackson-owasp-xml .
我试图使用此项目中的特定文件来为 Jackson 的 ObjectMapper 添加 Html Escape 功能。但我得到的输入作为输出,没有任何变化。该项目中的以下代码似乎没有进行任何编码。
public class OwaspCharacterEscapes extends CharacterEscapes {
private final int[] ESCAPES;
public OwaspCharacterEscapes() {
ESCAPES = standardAsciiEscapesForJSON();
for(int i=0;i<ESCAPES.length;i++) {
if(!(Character.isAlphabetic(i) || Character.isDigit(i))) {
ESCAPES[i] = CharacterEscapes.ESCAPE_CUSTOM;
}
}
}
@Override
public SerializableString getEscapeSequence(int ch) {
**String unicode = String.format("\\u%04x", ch);
return new SerializedString(unicode);**
}
@Override
public int[] getEscapeCodesForAscii() {
return ESCAPES;
}
private static final long serialVersionUID = 8140493311454723880L;
}
在getEscapeSequence
方法中,仅进行了从int ch
到string
的转换。我将该代码更改如下,然后它就可以工作了。
new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));
我从某处的 spring 文档中找到了该项目。所以我不想相信其中有什么问题,我错过了什么吗?
最佳答案
您提供的原始代码中突出显示的部分将 Unicode 基本多语言平面的字符的代码点转换为表示同一字符的 JavaScript Unicode 转义序列(字符串)。该代码有点可疑,因为它错误地处理了 BMP 之外的代码点,但可能是从中提取该代码的项目地址超出了所提供的类的范围。
对于 JavaScript(和 JSON)来说,Unicode 转义序列与相应的 Unicode 字符具有相同的含义,因此从一种形式转换为另一种形式不会以任何方式改变 JavaScript 片段的语义。执行此类转换的目的是支持通过不编码所有 Unicode 的文本格式(例如以任何 ISO-8859 系列编码进行编码的文本)传输 JavaScript 代码(和/或 JSON 数据)。由于转换不会改变语义,因此这对 XSS 没有影响。
无论如何,您可以通过您提供的代码获得的 Unicode 转义序列不是 HTML 字符实体。如果要执行HTML转义,比如替换<
与 <
,那么这是完全不同的事情,服务于完全不同的目的。
关于java - 仅仅是对 XSS 进行编码(而不是转义)是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905157/