
什么是Homoglyph揭秘25个你没见过的字母A——homoglyph同形字符检测完整入门【免费下载链接】homoglyphA big list of homoglyphs and some code to detect them项目地址: https://gitcode.com/gh_mirrors/ho/homoglyph**homoglyph同形字符**是那些长得几乎一模一样、却拥有不同 Unicode 编码的字符。开源项目homoglyph正是一份大规模的同形字符数据表 一套可直接用于生产的检测代码它能识别被同形字符伪装过的单词比如把credit写成ϲrEd1ᴛ常用于敏感词过滤、内容审核和安全防护。本文将带你从零认识同形字符并快速上手这套检测工具。一、25 个字母 A同形字符到底长什么样先来看一段迷惑性极强的文本同一字体渲染肉眼几乎无法区分A Α А Ꭺ ᗅ ᴀ ꓮ 这 25 个字符全都看起来像大写字母 A但它们的 Unicode 编码点各不相同——分别来自拉丁文、希腊文、西里尔文、切罗基文、加拿大原住民音节文字、全角字符、哥特文以及数学符号。同形字符的危害不在于混淆而在于绕过场景同形字符如何制造问题敏感词过滤把黑名单中的单词替换成同形字符机器匹配不到人却能看懂用户名/域名仿冒用西里尔字母а冒充拉丁a做出肉眼相同的假账号、假网址代码审计在源码中混入同形字符让0变成Ο埋下隐蔽 bug二、项目结构一览数据 检测双管齐下homoglyph 项目的组织非常清晰克隆仓库后即可按路径快速定位资源git clone https://gitcode.com/gh_mirrors/ho/homoglyph主要模块如下raw_data/chars.txt—— 核心数据表1860 行每行是一组互为同形的字符例如其中一行就是上面 25 个字母 Araw_data/char_codes.txt—— 同一份数据但用 16 进制 Unicode 编码点表示方便程序解析javascript/src/homoglyph.js—— 零依赖的 JavaScript 同形字符搜索函数node/index.js—— 封装成 Node.js 模块的入口即 npm 包homoglyph-searchsrc/main/java/net/codebox/homoglyph/Homoglyph.java—— Java 版检测类支持从 Maven 引入generator/main.py—— Python 生成脚本解析原始数据文件自动重新生成上述所有数据与代码文件这种一份数据、多语言产出的设计正是它的巧妙之处。三、3 行代码跑通检测JavaScript 快速上手1. 一键安装在node/目录下模块已打包为 npm 包直接安装npm install homoglyph-search2. 调用 search() 检测以仓库自带的示例 node/example/example.js 为例逻辑只有三行var homoglyphSearch require(homoglyph-search); var textToSearch Get free ϲrEd1ᴛ; // 被同形字符伪装的文本 var bannedWords [credit]; // 要检测的单词 var result homoglyphSearch.search(textToSearch, bannedWords); console.log(result);输出会告诉你文本中确实藏着一个伪装版credit并返回匹配的原文片段、目标单词和起始位置。也就是说ϲ希腊小写字母、1数字一、ᴛ数学粗体 t组成的假词逃不过它的法眼。3. Java 版本同样简单Java 侧通过 Maven 引入后使用HomoglyphBuilder.build()构建对象再调用search(textToSearch, bannedWords)即可返回结果列表结构与 JS 版一致。源码见src/main/java/net/codebox/homoglyph/Homoglyph.java。四、底层原理一张巨大的字符映射表打开 node/index.js 就能看懂核心机制模块内置了一个CHAR_MAP映射表把每个标准字符映射到它的所有替身例如0: [, 0, ⓪, ...], // 数字 0 的 80 多个同形替身 A: [Α, А, Ꭺ, , ...] // 字母 A 的 26 个同形替身检测流程是三步拆字符把待检文本按 Unicode 码位逐个拆开这里刻意绕开了 JS 字符串的.length陷阱逐位比对对目标单词的每个位置判断文本字符是否与标准字符相等、或在其替身列表中滑窗扫描从左到右滑动窗口收集所有命中位置并返回generator/目录下的 Python 脚本负责维护这张表data_file_parser.py解析generator/source_data/confusables.txt源自 Unicode 官方混淆字符表并补充了额外条目再由output_chars.py、output_char_codes.py、output_js.py等脚本统一输出各格式文件。想扩充数据改源头、跑一次main.py即可全量再生成。五、新手必知的两个 Unicode 坑 ⚠️这个项目的 README 特别强调了同形字符检测绕不开的两个语言级陷阱JavaScript 的长度陷阱 FOUR.length 4 .length 8 // 同样的 4 个字符长度却翻倍代码位高于 UFFFF 的字符在 JS 字符串中会占用 2 个 UTF-16 单元。本项目因此使用 ES6 的for...of循环来逐字符遍历保证拆分正确。Java 的 16 位 char 陷阱Java 的char类型只有 16 位无法表示高码位字符.length()同样会数错。项目中的 Java 实现改用int表示码位值正确处理这类高值字符。 小结只要你的检测逻辑依赖length或按字节/单元遍历字符串在同形字符面前都会翻车。六、如何验证检测能力跑一遍内置测试项目自带了覆盖全映射表的测试数据可以直观看到哪些伪装能被识别javascript/tests/js/tests/DataTests.jsDataTestsRunner.html浏览器里跑 Jasmine 测试逐字符验证每个同形替换都能命中node/test/spec/JSTests.js命令行回归测试例如验证search(UNIT T35TING, [TEST])能定位到第 5 位的伪装词T35Tcd node npm test跑通测试你就拥有了一套可审计的检测工具。✅七、总结一文记住 homoglyph 同形字符检测同形字符是 Unicode 时代形同而码不同的字符是敏感词过滤绕过的经典手法homoglyph 项目提供 1860 组同形字符数据raw_data/ JS/Java 双语言检测实现 Python 数据生成器使用只需两步安装homoglyph-search调用search(文本, 目标词列表)检测的核心是一张字符 → 替身列表的映射表配合正确的码位遍历即可警惕 JS 与 Java 在高码位字符上的长度陷阱这是新手最容易踩的坑无论你是做内容安全、风控审核还是仅仅想弄懂 Unicode 的暗面这份数据表加这两个库都足够你迈出同形字符检测的第一步。【免费下载链接】homoglyphA big list of homoglyphs and some code to detect them项目地址: https://gitcode.com/gh_mirrors/ho/homoglyph创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考