仅仅是 XSS 的编码(而不是转义)是错误的吗?

Is merely encoding (rather than escaping) for XSS wrong?

我遇到过这个项目https://github.com/rwinch/spring-jackson-owasp/blob/master/spring-jackson-owasp-xml

我试图使用此项目中的特定文件为 Jackson 的 ObjectMapper 添加 Html 转义功能。但是我得到的输入是没有变化的输出。似乎该项目的以下代码没有进行任何编码。

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 chstring的简单转换。我按如下方式更改了该代码,然后它就可以工作了。

new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));

我从某处 spring 的文档中找到了该项目。所以我不想相信其中有什么不对劲,我是不是漏掉了什么?

您提供的原始代码的突出显示部分将 Unicode 基本多语言平面字符的代码点转换为表示相同字符的 JavaScript Unicode 转义序列(字符串)。该代码有点可疑,因为它错误地处理了 BMP 之外的代码点,但可能是从中提取它的项目地址超出了 class 所提供的范围。

Unicode 转义序列与 JavaScript(和 JSON)作为相应的 Unicode 字符具有相同的含义,因此从一种形式转换为另一种形式不会改变一段 JavaScript 以任何方式。执行此类转换的目的是支持通过不对所有 Unicode 进行编码的文本格式传输 JavaScript 代码(和/或 JSON 数据),例如以任何 ISO- 8859 系列编码。由于转换后语义没有改变,因此这与 XSS 无关。

无论如何,您可以通过您提供的代码获得的 Unicode 转义序列不是 HTML 字符实体。如果你想执行 HTML 转义,比如用 &lt; 替换 <,那是完全不同的事情,服务于完全不同的目的。