哪些Unicode字符是危险的?

11

哪些Unicode字符(更准确地说是码点)是危险的,应该被列入黑名单并禁止用户使用?我知道BIDI覆盖字符和“零宽度空格”很容易造成问题,但还有其他哪些字符呢?

谢谢


2
可能会在布局中出现问题(如BIDI字符),发布空评论,这类事情。 - federico-t
1
这些对我来说并不危险。有时您只需要小心处理事情:“希伯来字母表是‪אָלֶף־בֵּית עִבְרִי‬,并从右到左书写。” - tchrist
你知道,你无法阻止人们发布“空”评论。 - tchrist
7
我听说U+2423会在你背后时刺向你。 - Cat Plus Plus
2
@CatPlusPlus事实上应该是U+1F0AB,尤其是在跟随U+100CB之后。 - tchrist
显示剩余2条评论
5个回答

5

4
一个安全中的黄金法则是使用白名单而不是黑名单,即不尝试覆盖所有坏字符,而是基于确保用户仅使用已知良好字符进行验证。有一些解决方案可帮助您构建所需的国际白名单。例如,在.NET中有UnicodeCategory。这个想法是,库将它们分配到类别中,如字母数字字符、标点符号、控制字符等,而不是列出成千上万个单独的字符。.NET中国际字符白名单教程 Unicode正则表达式:类别

3
是的,我知道那样会更安全。但同时,Unicode字符有成千上万个(适用于许多语言),我无法全部列入白名单。即使我这样做了,可能也会漏掉很多语言,所以我更喜欢使用黑名单。 - federico-t
1
有一些解决方案可以帮助您构建白名单,我已经更新了一篇涉及.NET的处理此问题的文章。我想JAVA也一定有相应的库。 - Desmond Zhou
1
有趣...我以为这么大的白名单会非常低效。我会查一下的。不过我很遗憾我在用 PHP。 - federico-t
1
好吧,至少在PHP中你有可以容忍的正则表达式。 - tchrist
黄金法则是深度防御。如果您可以使用范围进行黑名单处理,请在白名单之前执行该操作。您无法对所有内容进行黑名单处理,但可以确保墙外有护城河。 - Anthony Rutledge

1

'HANGUL FILLER' (U+3164)

自1993年Unicode 1.1版本以来,有一个空的宽度为零的字符。

我们看不到它,也无法单独复制/粘贴它,因为我们无法选择它!

需要通过unix键盘快捷方式生成:CTRL + SHIFT + u + 3164

它可以很好地处理任何内容:变量、函数名、URL、文件名、模仿DNS、使哈希字符串失效、数据库条目、博客文章、登录、允许伪造相同的账户等。


演示1:更改变量

变量hijacked包含一个韩文填充字符,控制台日志调用不带该字符的变量:

const normal = "Hello w488ld"
const hijaㅤcked = "Hello w488ld"
console.log(normal)
console.log(hijacked)


演示2: 劫持URL

这3个URL将导致xn--stackoverflow-fr16ea.com:

https://stackㅤㅤoverflow.com

https://stackㅤㅤoverflow.com

https://stackㅤㅤoverflow.com


0

U+2800 布莱叶字符空白 - 一种没有任何“点”的布莱叶字符。它看起来像普通的“空格”,但不被归类为一个。


0

请查看Unicode安全注意事项报告

该报告涵盖了各个方面,从伪造呈现字符串到在不安全的语言中处理UTF编码的危险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接