问题标签 [homoglyph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1939 浏览

unicode - 散列时适合密码的 Unicode 规范化(和其他处理)是什么?

如果我接受完整的 Unicode 密码,我应该如何在将字符串传递给哈希函数之前对其进行规范化?

目标

如果没有规范化,如果有人ma\u00F1ana在一台计算机ma\u006E\u0303ana上将他们的密码设置为“mañana”(这是在用户代理或其操作系统的控制之下。

  • 我想确保这些哈希值相同。
  • 我不关心诸如Α、А 和 A(希腊语、西里尔语、拉丁语)之类的同形文字。

参考

Unicode 规范化形式:http ://unicode.org/reports/tr15/#Norm_Forms

注意事项

  • 任何标准化过程都可能导致冲突,例如"office" == "office"
  • 规范化可以改变字符串中的字节数。

进一步的问题

  • 如果服务器接收到无效的 UTF-8(或其他格式)的字节序列会发生什么?拒绝,因为它不能被规范化?
  • 如果服务器接收到在其 Unicode 版本中未分配的字符会怎样?
0 投票
1 回答
519 浏览

java - 查找所有“字符相等”字符串的有效算法?

我们如何编写一个高效的函数来输出输入字符串的“同形文字等价物”?

示例 1(伪代码):

示例 2

示例 3

注意:输出数组中成员的顺序并不重要,我们可以假设给定的同形符号映射是正确的(输入不会给我们一个“无限循环”)。

我当前的算法有效,但它使用原始暴力破解,性能很糟糕。例如,输入"mmmmm"with homoglyphs["rn", "m", "nn"]需要 38 秒才能运行:

我们如何实现一个高效(快速)的同形字扩展算法?

0 投票
2 回答
2037 浏览

java - 电子邮件网络钓鱼中的同形文字攻击检测

主要问题

我正在使用 Java 开发一个 API,该 API 需要检测网络钓鱼电子邮件中品牌(例如 PayPal、Mastercard 等)的使用。

显然,攻击者使用不同的策略来攻击这些品牌,从而使它们更难被发现。例如,“ rnastercard ”看起来与“ mastercard ”非常相似,可以欺骗毫无戒心的用户。

此时我可以使用模糊字符串搜索的形式轻松检测这些品牌的拼写错误。然而,我面临的问题是当攻击者使用同音字来更改特定品牌的名称但保持相同的视觉解释时。

同形字攻击将[a-zA-Z]模式中的字符替换为看起来相似但超出此范围的字符。例如,使用特定字符集的攻击者可以使用看起来像 P的希腊字母 RHO来攻击 PayPal。此类攻击中的 PayPal 品牌名称将变为:

[希腊字符 RHO][a][y][希腊字符 RHO][a][l]

由于我对 Unicode 或 ISO 标准及其编码等不同标准几乎没有经验,因此我呼吁您提供建议。有没有办法以编程方式确定[a-zA-Z] 集合之外的字符的视觉等效项,以便结果是[a-zA-Z] 集合内的字符?

您的某些答案可能基于特定的字符集,我正在寻找一种解决方案,以帮助我确定电子邮件中可用的每个字符集的此类表示。

我还没有阅读邮件交换的 RFC 标准,但它们在我的列表中,我现在问这个问题是为了节省时间。

可能但不可行的解决方案

我已经想到了一些解决方案,但它们不适用于我的特定情况,因为它们非常占用 CPU 并且具有类似 hack 的性质(阅读“可能很容易被破坏”)。

第一个解决方案是将[a-zA-Z] 之外的字符以其形式写入图像,并将该图像提供给 OCR API 以获得最接近的[a-zA-Z]表示。

第二种解决方案是为每个字符集创建一个映射,映射的键是字符本身,值是它的[a-zA-Z]等效项。该地图要么必须手工完成,要么必须使用上述第一种解决方案。

额外细节

我已经在这里问过这个问题。然而,尽管我进行了编辑,这个问题仍然没有解决。可能是因为我没有很好地表达自己,并且我没有正确标记问题。

在那个特定的问题中,我还解决了我对 Java 使用的字符集的一些担忧,这些担忧掩盖了实际问题。但是,如果您觉得有必要在您的答案中包含此类信息,我将不胜感激,因为这可以节省我研究此类问题的时间。同形字攻击的问题和 Java 或 *javax.mail.** 中的字符集问题是分开但相互关联的。

作为主要问题中描述的同形文字攻击的一个特定示例是这封电子邮件。谨防!这是使用这种特定攻击方法的网络钓鱼电子邮件的实际内容,因此请不要点击该电子邮件中包含的任何链接。

我已经用我认为合适的标签标记了这个问题,如果您不同意,请提供对此问题的编辑,而不是投票结束。

0 投票
2 回答
1052 浏览

regex - 只允许字符串中的字母和数字,但不能混淆

假设我希望用户名仅由字母和数字组成,而与语言无关。

我想我可以用以下正则表达式部分来完成这个

现在我遇到的问题是,用户可能会通过使用与另一个用户的用户名相同的用户名来伪装成其他用户(同形词攻击)。admin vs admin 就是一个例子。

我想不可能使用正则表达式轻松排除既是字母又是易混淆的字符,但是在正则表达式的上下文之外呢?易混淆的 unicode id 是否位于我们可以过滤的特定范围内或类似的范围内?

0 投票
0 回答
32 浏览

php - 替换php字符串中的同形文字

我正在开发一个反垃圾邮件机器人,它很难解码同形字。

这是一条示例消息:

我尝试了几种解决方案,但似乎没有一个能正确完成这项工作。其实我有这个代码:

?>

输出有问题:

我不知道为什么。我可以获得正确结果的唯一方法是使用 TESSERACT-OCR(光学字符识别),但我需要创建一个带有文本的图像,这对于每秒处理数百条消息的机器人来说不是一个选项。

任何帮助,将不胜感激。谢谢你。