javascript - 如何清理 URL 中的所有 Unicode 字符
问题描述
我们有一个基于聊天的应用程序,我们的客户代表可以在其中与最终用户聊天。最近,我们的安全团队发现我们的应用程序存在问题,用户可以在聊天窗口中注入同形异义词版本的 Url。
示例: 如果最终用户在聊天窗口中键入以下问题:如何在http://www.abc®s.ca更改我的电子邮件设置
在上面的例子中,site 是同形异义的版本,其中“оs.ca”是非 ascii 字符,而原始 url 可能是http://www.abcos.ca (我只是编了这些 url 示例)
所以我尝试在我的 javascript 中使用以下代码:
var chatMessage = 'How to change my email settings at http://www.abcоs.ca'
chatMessage.normalize('NFD').replace(/[^\u0000-\u007f]/g, '');
上面的脚本运行良好,它去掉了非 ascii 字符,但我们同时支持英语和法语聊天,
如果 chatMessage 是“评论修饰符 mes paramètres de messagerie sur http://www.abcоs.ca
然后它在经过清理的版本中将“è”替换为“e”。
想知道是否有办法从 javascript 中的输入文本值中检测 url 中的非 ascii 字符,以便预期结果是:“Comment modifier mes paramètres de messagerie sur http://www.abc”这样法语字符仍保留在文本中,但在 url 内的非 ascii 字符已被清理。
感谢专家的建议和指导。
解决方案
好的,
您可以在此处使用可混淆的支持列表 -> https://www.unicode.org/Public/security/10.0.0/confusables.txt
在@https ://www.npmjs.com/package/unicode-confusables 中还有一个包含此数据的 NPM 包
现在使用这些数据,我们可以检查任何可混淆的内容并替换为正常的,或者只是替换为一些 glyth 以显示它是可混淆的,这可能是最好的选择,因为它让用户知道发布消息的人可能是某人不要相信。
我在下面的代码段中还使用了一个 CDN 版本。
例子..
const tests = [
"оs.ca",
"Comment modifier mes paramètres de messagerie sur http://www.abcоs.ca"
];
async function run() {
const f = await fetch('https://cdn.jsdelivr.net/npm/unicode-confusables-data@10.0.0-20170721/confusables.json');
const confusables = await f.json();
function sanitize(a, show) {
const chars = [...a];
for (let l = 0; l < chars.length; l += 1) {
const confused = confusables[chars[l]];
if (confused !== undefined) {
if (show) chars[l] = '';
else chars[l] = confused;
}
}
return chars.join('');
}
console.log('show confusables');
for (const test of tests)
console.log(sanitize(test, true));
console.log('replace with none confusables');
for (const test of tests)
console.log(sanitize(test, false));
}
run();
推荐阅读
- javascript - 如何在垂直菜单(单页网站)中将滚动类更改为当前图标?
- matlab - 根据条件绘制排除某些类别的组变量
- node.js - 通过 crontab 调用 Python 子进程不起作用
- javascript - 刷新 iframe 会出现 404
- swift - SQLite Swift中有条件时如何计算列的总和?
- bash - Shell脚本:复制文件和文件夹N次
- apache-kafka - 如何将 Rest API 源连接器与 Kafka Connect 集成?
- javascript - React setstate 方法的回调未触发
- linux - 如何向此 bash 脚本添加第三个参数?
- python - 从字典到 Excel 表的值