20

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

UTF-8 字节序列“E2-80-A8”(U+2028,行分隔符),Unicode 数据库中完全有效的字符。但是,该序列表示行分隔符(是的,除“0A”之外)。

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

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

以上只是 Unicode 如何意外破坏您的系统的一个示例。据我所知,一些黑客可以使用 RTL 和其他控制字符来为他们谋福利。Unicode 规范中有很多“引号”、“空格”、“符号”和“控件”。

问题:

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

编辑:

我不要求 JSON 或 JavaScript。我要求在所有程序中处理 Unicode 的一般最佳实践。

4

4 回答 4

9

它破坏了 javascript,因为字符串中不能有换行符:

var myString = "

";

//SyntaxError: Unexpected token ILLEGAL

现在,UTF-8 序列"E2-80-A8"解码为 un​​icode 代码点U+2028,其处理方式类似于 javascript 中的换行符:

 var myString = "
";

//Syntax Error

但是,写起来是安全的

var myString = "\u2028";
//you can now log myString in console and get real representation of this character

这就是正确编码的 JSON 所具有的。我会考虑正确编码 JSON,而不是保留不安全字符的黑名单。(它们是 U+2028 和 U+2029 AFAIK)。

在 PHP 中:

echo json_encode( chr(0xe2). chr(0x80).chr(0xA8 ) );
//"\u2028"
于 2012-05-11T19:18:13.063 回答
4

查看 Unicode 图表。有一个非打印字符列表。这些是潜在的麻烦制造者。你的朋友 U+2028 有很多朋友:http ://www.unicode.org/charts/PDF/U2000.pdf而且它不只是在 2000 范围内。

您可以将它们全部核对,也可以将它们分成不同的类别(像 U+2028 这样的 SEP 字符变为 \n 或正确转义)等。

高温高压

于 2012-05-19T16:45:59.637 回答
4

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

看看图书馆的ICU 项目

于 2012-05-20T18:00:45.550 回答
3

AZ、az 和 0-9 通常是安全的。在这 62 个字符之外,您将遇到某些系统的问题。没有人可以给你其他答案。

例如,您提到域名。处理 Unicode 域名的唯一方法是遵循 RFC 3454 和 RFC 5890-5893,并仅以这种方式处理数据。大多数 Unix 文件系统上的文件名是不包括 / 或 \0 的任意字节字符串。在功能上将 Unix 上的文件名视为 Unicode 字符串而不破坏任何内容本身就是一个问题。请注意,Windows 文件名不是 AZ 安全的;NUL 和 PRN 之类的东西是保留名称。每个领域都有自己的小问题和怪癖,没有简单的总结足以满足任何地方的需要。

于 2012-05-18T01:11:07.097 回答