Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 如何防范Unicode安全漏洞 是一个博客文章,展示了Unicode字符是如何用作网站的攻击向量的。_Security_Unicode_Unique_String Comparison_Owasp - Fatal编程技术网

Security 如何防范Unicode安全漏洞 是一个博客文章,展示了Unicode字符是如何用作网站的攻击向量的。

Security 如何防范Unicode安全漏洞 是一个博客文章,展示了Unicode字符是如何用作网站的攻击向量的。,security,unicode,unique,string-comparison,owasp,Security,Unicode,Unique,String Comparison,Owasp,这种真实世界攻击的主要例子是一个假WhatsApp应用程序提交给Google Play商店,在开发者名称中使用unicode不可打印的空格,这使得名称唯一,并允许它通过Google的过滤器。蒙古语元音分隔符(U+180E)就是这样一种不可打印的空格字符 另一个漏洞是使用外观相似的替代Unicode字符。该工具显示了这是如何工作的 我能想到的一个例子是在注册新用户时保护用户名。您不希望两个用户名相同或看起来相同 你如何防范这种情况?有这些角色的列表吗?从所有表单输入中删除所有这些类型的字符是否是

这种真实世界攻击的主要例子是一个假WhatsApp应用程序提交给Google Play商店,在开发者名称中使用unicode不可打印的空格,这使得名称唯一,并允许它通过Google的过滤器。蒙古语元音分隔符(U+180E)就是这样一种不可打印的空格字符

另一个漏洞是使用外观相似的替代Unicode字符。该工具显示了这是如何工作的

我能想到的一个例子是在注册新用户时保护用户名。您不希望两个用户名相同或看起来相同


你如何防范这种情况?有这些角色的列表吗?从所有表单输入中删除所有这些类型的字符是否是常见的做法

当您有已知安全值的白名单,并且排除所有其他值时,所有消毒效果最佳


ASCII就是这样一组字符。

这可以通过各种方式实现,但是每种方式都可能增加误报的数量,从而导致合法用户的烦恼。此外,它们中的任何一个都不能适用于100%的情况(即使合并)。他们将只添加一个额外的层

一种方法是让表中的字符看起来相似,并检查是否存在重复的名称。在许多情况下,“相似”的意思是主观的,所以建立这样的列表可能很棘手。这种方法在某些情况下可能会产生误报

此外,颠倒某些字母的顺序可能会欺骗许多用户。可以使用类似于Jaro Winkler和Levenshtein distance的算法(即,检查是否已经存在类似的用户名/公司名称)来检查字谜或非常相似的名称。然而,有时这可能是由于某些地区某些单词的拼写不同(例如,“center”与“center”),或者某些公司的名称可能故意包含一个字谜。这种方法可能会进一步增加误报的数量

此外,如前所述,消毒也是一种很好的方法,但它可能无法防止字谜,并给想要使用某些特殊字符的合法用户带来问题

正如OP也提到的,特殊字符也可以剥离。名称的其他部分也可能需要删除,例如“Inc.”、“.com”等常见名称

最后,名称可以限制为仅包含一种语言的字符,而不包含来自不同语言的字符的混合(更宽松的版本可能不允许在同一个单词中混合字符,而如果用空格分隔则允许)。限制对其余字母使用大写字母和小写字母可以进一步改进这种方法,因为当使用某些字体时,某些小写字母(如“l”)可能看起来像大写字母(如“I”)。排除某些符号(如“|”)的使用将进一步增强这种方法。此解决方案将增加某些用户的烦恼,这些用户将无法使用某些名称


也可以使用上述一些/所有方法的组合。方法的选择及其应用方式(例如,您可以选择禁止使用类似的名称,或在名称相似时要求版主批准,或不采取任何行动,而只是警告版主/管理员)取决于您试图解决的场景。

我可能有一个关于用户名的创新解决方案。显然,您希望允许使用ASCII字符,但在某些特殊情况下,将使用其他字符(正如您所说的不同语言)

我认为一种直观的方法是,允许在用户名中同时使用ASCII和其他字符,同时防止“Unicode漏洞”,如下所示:

允许使用所有ASCII字符,不允许使用其他字符,除非用户名中有x个或更多这些特殊字符(用户名使用另一种语言)

例如:

Whatsapp,Inc+(U+180E)不允许,只有一个特殊字符

эч+(U+180E)允许!它有超过x个特殊字符(例如,3个)。它可以使用蒙古语分隔符,因为它是蒙古语

显然,这并不能100%保护您免受这些类型的漏洞的攻击,但这是我一直在使用的一种非常有效的方法,特别是如果您在“登录”或“注册”页面上没有提及此算法的存在,因为攻击者可能会发现您有一种算法保护网站免受这些类型的攻击,但不要提及它,这样他们就无法对其进行反向工程,并找到绕过它的方法

抱歉,如果这不是你想要的答案,请分享我的想法


编辑:或者您可以使用RNN(递归神经网络)AI来检测该语言并允许该语言中的特定字符。

您所说的是同形文字攻击

这里有一个Unicode的“confusables”列表,还可以查看。应该有基于这些或其他数据库的图书馆。一个这样的库可以在Java或Javascript中使用。其他语言也必须如此,或者您可以编写一种

我认为最重要的是不要拥有自己的数据库——在好的数据基础上,图书馆或服务很容易做到

至于你是否应该过滤掉相似的用户名,我认为这要视情况而定。如果用户有兴趣尝试伪造对方的用户名,也许是的。对于许多其他类型的数据,这样做可能没有意义。我认为,除了您应该在应用程序中评估风险之外,没有通用的最佳实践