17

我正在重新发明轮子并在 Java 中创建自己的 JSON 解析方法。

我正在阅读 json.org上的(非常好的!)文档。我不确定的唯一部分是它在哪里说“或控制字符”

由于文档非常清晰,而且 JSON 非常简单且易于实现,我想我会继续要求规范而不是松散。

如何正确去除 Java 中的控制字符?也许有一个unicode范围?

在此处输入图像描述


编辑:一个(通常?)拼图缺失的部分

被告知在定义的范围 1 2之外还有其他控制字符在<script>标签中可能很麻烦。

最值得注意的是字符 U+2028 和 U+2029、行和段落分隔符,它们充当换行符。在字符串文字中间注入换行符很可能会导致语法错误(未终止的字符串文字)。3

虽然我相信这不会构成 XSS 威胁,但在<script>标签中添加额外的使用规则仍然是一个好主意。

  • 只需简单并使用\u符号对所有非“ASCII 可打印”字符进行编码。这些角色一开始并不常见。如果您愿意,您可以添加到白名单中,但我推荐使用白名单方法。
  • 如果您不知道,请不要忘记</script不区分大小写),这可能会导致 HTML 脚本注入带有字符的页面</script><script src=http://tinyurl.com/abcdef>。默认情况下,这些字符都不是以 JSON 编码的。
4

4 回答 4

8

Character.isISOControl(...)会吗?顺便说一句,UTF-16 是 Unicode 代码点的编码......您打算在字节级别还是在字符/代码点级别进行操作?我建议保留从 UTF-16 到字符流到 Java 核心 API 的映射...

于 2011-05-18T22:04:57.010 回答
6

即使不是很具体,我也会假设它们指的是 Unicode 规范中的“控制”字符类别

在 Java 中,您可以c使用以下表达式检查字符是否为 Unicode 控制字符:Character.getType(c) == Character.CONTROL.

于 2011-05-18T22:04:42.580 回答
4

我相信控制字符的 Unicode 定义是:

U+0000..U+001F 和 U+007F..U+009F 范围内的 65 个字符。

那是他们对控制码的定义,但上面后面是一句“也称为控制字符”。, 所以...

于 2011-05-18T22:06:09.080 回答
4

我知道这个问题已经在几年前被问过了,但我还是要回复,因为接受的答案不正确。

Character.isISOControl(int codePoint) 

执行以下检查:

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);

JSON 规范在https://www.rfc-editor.org/rfc/rfc7159中定义:

  1. 字符串

字符串的表示类似于 C 系列编程语言中使用的约定。字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。

Character.isISOControl(int codePoint) 

将标记所有需要转义的字符(U+0000-U+001F),尽管它也会标记不需要转义的字符(U+007F-U+009F)。不需要对字符进行转义(U+007F-U+009F)

于 2016-07-08T12:56:09.973 回答