应在输出中过滤的Unicode字符列表?

Den*_*s C 20 unicode jsonp escaping data-quality

最近我因浏览器支持的数据质量而遇到了一个错误,我正在寻找一个安全的规则来应用没有双倍大小的字符串转义,除非需要.

UTF-8字节序列"E2-80-A8"(U + 2028,LINE SEPARATOR),Unicode数据库中完全有效的字符.但是,该序列表示行分隔符(是,否则为"0A").

很糟糕的是,许多浏览器(包括Chrome,Firefox和Safari;我没有测试其他浏览器)无法处理JSONP回调,该回调具有包含该Unicode字符的字符串.JSONP包含在非Unicode HTML中,我没有任何控制权.

浏览器只是在这样的JavaScript上报告了INVALID CODE /语法错误,这些错误从调试工具和所有文本编辑器看起来都是有效的.我猜测它可能会尝试将"E2-80-A8"转换为BIG-5并打破JS语法.

以上只是Unicode如何破坏系统意外情况的一个示例.据我所知,一些黑客可以使用RTL和其他控制字符.Unicode规范中有许多"引号","空格","符号"和"控件".

题:

是否有一个Unicode字符列表供每个程序员了解我们可能不希望它们在我们的应用程序中有效的隐藏功能(和错误).(例如Windows禁用文件名中的RTL).

编辑:

我不是要求JSON也不是JavaScript.我要求所有程序的Unicode处理的一般最佳实践.

Esa*_*ija 9

它打破了javascript,因为字符串不能有新行:

var myString = "

";

//SyntaxError: Unexpected token ILLEGAL
Run Code Online (Sandbox Code Playgroud)

现在,UTF-8序列"E2-80-A8"解码为unicode代码点U+2028,其被视为类似于javascript中的换行符:

 var myString = "?";

//Syntax Error
Run Code Online (Sandbox Code Playgroud)

但是,编写是安全的

var myString = "\u2028";
//you can now log myString in console and get real representation of this character
Run Code Online (Sandbox Code Playgroud)

这是JSON将正确编码的内容.我会考虑正确编码JSON,而不是保留不安全字符的黑名单.(这是U + 2028和U + 2029 AFAIK).

在PHP中:

echo json_encode( chr(0xe2). chr(0x80).chr(0xA8 ) );
//"\u2028"
Run Code Online (Sandbox Code Playgroud)

  • 这是一个奇怪的漏洞,U + 2028/2029在JSON中有效,尽管JavaScript中的原始版本无效(因此JSONP).一个好的JSON编码器应该逃避它们的兼容性,但实际上很少. (5认同)

jth*_*ill 4

有一个字符属性数据库和一个描述它的报告,即UNICODE CHARACTER DATABASE,它很好地说明了浏览器“应该”如何处理代码点。我喜欢这个词,“应该”。最安全的是白名单,您可以使用 L|M|N|S、字母、标记、数字或符号。

看看图书馆的ICU 项目