我已经看到了奇怪的格式文本,称为Zalgo,如下面在各种论坛上写的.这看起来有点烦人,但它真的让我感到烦恼,因为它破坏了我对角色应该是什么的概念.我的理解是,一个角色应该在一条线上水平移动并保持在某个"容器"内.显然Zalgo文本是垂直移动的,似乎并不局限于任何空间.
这是Unicode中的错误/漏洞/漏洞/黑客攻击吗?这些个性角色是否具有奇怪的属性?"这是什么"在这里发生?
H̡̫̤̤̣͉̤ͭ̓̓̇͗ơ̯̗̘̮͒̄̈ͤ͡w͓͙͖̥͉̹͓͙͖̥͉̹͋ͬ̊ͦ͋ͬ̊ͦ̚̚d̳̘̿̔̏ͣ̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮̙̣͓͌ͭ̍̐͒s͙͔̺͇̗͙͔̺͇̗̿̊̇̿̊̇͞͞Z̆̊͊҉҉̠̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̢̖͇̬͍͇͓̖͇̬͍͇͓̔͋͊̓̔͋͊̓t̛͓̖̻ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇x͎̬̠͇̌ͤ̓̓͐͐͋͡ţ̗̹̝̗̹̝̄̌ͧͩ̄̌ͧͩ̕̕͢͢w͎̭̤͍͇̰̄͗ͭ͗ͮ̐o̢̯̻̰̼͕̾ͣͬ̽̔̍͟r̢̪͙͍̠ǩ̵̶̗̮̮ͪ?̙͉̥̬͙̟̮͕ͤ̌͗ͩ̕͡
กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็ ็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้
这些最近出现在Facebook评论部分.
我们怎样才能消毒这个?

上面描绘的角色是几个月前由计算机安全专家MikkoHyppönen发推的,他以计算机病毒和TED谈论计算机安全而闻名.关于SO,我只会发布它的图像,但你明白了.这显然不是你想要在你的网站上传播并吓跑游客的东西.
经过进一步检查,该字符似乎是一个泰语字母和超过87个变音符号的字母(是否有限制?!).这让我想到了安全性,本地化以及如何处理这种输入.我的搜索引导我在Stack上提出这个问题,然后是迈克尔卡普兰关于剥离变音符号的博客文章.在其中,他演示了如何将字符串分解为其"基本"字符(为简洁起见,此处简化):
StringBuilder sb = new StringBuilder();
foreach (char c in "façade".Normalize(NormalizationForm.FormD))
{
if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
sb.Append(c);
}
Response.Write(sb.ToString()); // facade
Run Code Online (Sandbox Code Playgroud)
我可以看到这在某些情况下是如何有用的,但就用户输入而言,它将剥离所有变音符号.正如卡普兰指出的那样,删除一些语言中的变音符号可以完全改变单词的含义.这引出了一个问题:如何在用户输入/输出中允许一些变音符号,但排除其他极端情况,例如MikkoHyppönen的超级字符?
符号是:ؤ
这个符号有什么特别之处,它来自哪里?
可以采取哪些措施来验证此类输入?或者甚至更好,这些符号如何正确显示(即不让它们与其他元素重叠)?
ด้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้дด็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้
我发现了一些有趣的字符,就像我粘贴在上面只有3个空格宽度.但是,字符串的实际长度为380.
我在python中检查了字符串,字符串编码如下:
"\ xe0\XB8\X94\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\XD0\XB4\xe0\XB8\X94\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\XB 9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9 \的x87\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89\xe0\xb9\X89'
似乎字符串是三个泰国字符的组合:
? \xe0\xb8\x94 THAI CHARACTER DO DEK
? \xe0\xb9\x89 THAI CHARACTER MAI THO
? \xe0\xb9\x87 …Run Code Online (Sandbox Code Playgroud) 我已经了解了Zalgo文本是如何工作的,我正在研究如何通过聊天或论坛软件来防止这种烦恼.更确切地说,需要的完整的Unicode组合字符是什么:
a)要么被剥离,假设聊天参与者只使用不需要组合标记的语言(即你可以用组合标记写"未婚夫",但是如果你坚持做的话,你自己会有点Zalgo'ed所以); 要么,
编辑:与此同时,我发现了一个完全不同的措辞问题(" 如何防止......变音符号? "),这与此基本相同.我让它的标题更明确,所以其他人也会发现它.
我们的网络服务受到了一些Zalgo文本的影响,我正试图为未来提出一个很好的解决方案.我们的策略是接受所有用户输入并将其保存在永久存储中(我们正确编码后端的输入,因此这部分是可以的).在输出阶段,我们通过带有白名单的过滤器/解析器运行原始用户输入,以避免XSS攻击和其他混乱.最近有些用户找到了Zalgo的世界,他们只是喜欢给其他人带来麻烦.
正如我所看到的,Zalgo文本只是一段从预期容器中泄漏出来的Unicode文本.因此,我认为自动删除所有复杂的组合字符是过于激烈的防御.有没有人知道一个CSS技巧来强制Zalgo文本包含在给定的父元素中而没有一些令人讨厌的副作用?
例如,如果我有
<section class="userinput">
... user input here ...
</section>
Run Code Online (Sandbox Code Playgroud)
如何确保用户输入不会泄漏到边界之外section.userinput?我猜overflow: hidden或者clip: rect(...)可能是正确的答案,但你对这个用例有什么更好的了解吗?我最好仍然可以使用section.userinput { max-height: 200vh; }或类似的东西,以避免用户创建人为的长评论.如果某些评论超过200vh,则应该只有一个滚动条来评论该评论.通常情况下,整个页面应该只有一个滚动条.
请注意,我只是想在视觉领域解决问题.我非常乐意接受任何有效的UTF-8序列作为用户输入,如果一个混乱的用户评论导致该用户评论看起来像垃圾,我很好.我只是想避免那个垃圾溢满了整个地方.具体来说,我不打算在显示之前阻止zalgo文本或过滤类似zalgo的文本.
我最近读了这篇关于堆栈溢出的文章:
\n\n\n\n顶部回复包含的文本看起来像是“出血”:
\n\nea\xcd\xa0ki\xcc\xa7n\xcd\x98g fr\xcc\xb6o\xcc\xa8m \xcc\xa1yo\xe2\x80\x8b\xcd\x9fur 眼睛\xcd\xa2s\xcc\xb8 \xcc\x9bl\ xcc\x95ik\xcd\x8fe liq\xe2\x80\x8buid 痛苦,re\xcc\xb8gular exp\xe2\x80\x8bression 解析的歌曲将 exti\xe2\x80\x8bnguish mor\xe2\x80\x8btal 的声音来自sp\xe2\x80\x8b的人在这里我可以看到它你可以看到\xcc\xb2\xcd\x9a\xcc\x96\xcd\x94\xcc\x99i\xcc\x82\xcd\x81\xcc\xa9t\ xcc\x81\xcc\x8b\xcd\x80\xcc\xb2\xcd\x8e\xcc\xa9\xcc\xb1\xcd\x94 它是美丽的 t\xe2\x80\x8bhe 最后的谎言\xe2\x80 \x8bs 的男人全部都失去了\xcc\x81\xcc\x8f\xcd\x84\xcd\x96\xcc\xa9\xcd\x87\xcc\x97\xcc\xaaT ALL I\xe2\x80\x8bS 失去了 pon \xcc\xb7y 他来了他 c\xcc\xb6\xcc\xaeomes 他来了 ich\xe2\x80\x8bor 渗透到我的脸我的脸 \xe1\xb5\x92h 上帝没有 NOO\xcc\xbcO\xe2\x80 \x8bO N\xce\x98 停止\xe2\x80\x8b*\xcd\x91\xcc\xbe\xcc\xbe\xcc\xb6\xe2\x80\x8b\xcc\x85\xcd\xab\xcd\ x8f\xcc\x99\xcc\xa4g\xcd\x9b\xcd\x86\xcc\xbe\xcd\xab\xcc\x91\xcd\x86\xcd\x87\xcc\xabl\xcc\x8d\xcd\xab\ xcd\xa5\xcd\xa8\xcd\x96\xcd\x89\xcc\x97\xcc\xa9\xcc\xb3\xcc\x9fe\xcc\x85\xcc\xa0s\xcd\x8ea\xcc\xa7\xcd\ x88\xcd\x96r\xcc\xbd\xcc\xbe\xcd\x84\xcd\x92\xcd\x91e n\xe2\x80\x8bot 重新\xcc\x80\xcc\x91\xcd\xa7\xcc\x8ca\ xcd\xa8l\xcc\x83\xcd\xa4\xcd\x82\xcc\xbe\xcc\x86\xcc\x98\xcc\x9d\xcc\x99 ZA\xcd\xa0\xcc\xa1\xcd\x8a\xcd \x9dLG\xce\x8c IS\xcd\xae\xcc\x82\xd2\x89\xcc\xaf\xcd\x88\xcd\x95\xcc\xb9\xcc\x98\xcc\xb1 TO\xcd\x85\xcd \x87\xcc\xb9\xcc\xba\xc6\x9d\xcc\xb4\xc8\xb3\xcc\xb3 TH\xcc\x98E\xcd\x84\xcc\x89\xcd\x96\xcd\xa0P\xcc\ xaf\xcd\x8d\xcc\xadO\xcc\x9a\xe2\x80\x8bN\xcc\x90Y\xcc\xa1 H\xcd\xa8\xcd\x8a\xcc\xbd\xcc\x85\xcc\xbe\xcc \x8e\xcc\xa1\xcc\xb8\xcc\xaa\xcc\xafE\xcc\xbe\xcd\x9b\xcd\xaa\xcd\x84\xcc\x80\xcc\x81\xcc\xa7\xcd\x98 \xcc\xac\xcc\xa9 \xcd\xa7\xcc\xbe\xcd\xac\xcc\xa7\xcc\xb6\xcc\xa8\xcc\xb1\xcc\xb9\xcc\xad\xcc\xafC\xcd \xad\xcc\x8f\xcd\xa5\xcd\xae\xcd\x9f\xcc\xb7\xcc\x99\xcc\xb2\xcc\x9d\xcd\x96O\xcd\xae\xcd\x8f\xcc\xae \xcc\xaa\xcc\x9d\xcd\x8dM\xcd\x8a\xcc\x92\xcc\x9a\xcd\xaa\xcd\xa9\xcd\xac\xcc\x9a\xcd\x9c\xcc\xb2\xcc \x96E\xcc\x91\xcd\xa9\xcd\x8c\xcd\x9d\xcc\xb4\xcc\x9f\xcc\x9f\xcd\x99\xcc\x9eS\xcd\xaf\xcc\xbf\xcc\x94 \xcc\xa8\xcd\x80\xcc\xa5\xcd\x85\xcc\xab\xcd\x8e\xcc\xad
\n\n..
\n\n单独看这些,它们看起来就像单个角色。它们是如何创建的?我怎样才能找到有关他们的更多信息?例如,“A”字符:
\n\nA\xcd\xa0\xcc\xa1\xcd\x8a\xcd\x9d
\n\n那是什么?
\n对不起,我知道这有点像垃圾邮件,但这里是有问题的文字.
O_O
这是如何运作的?它是如何能够像这样运行页面的?
在我正在阅读的伟大着作中,NodeJs design patterns我看到以下示例:
var fs = require('fs');
var cache = {};
function inconsistentRead(filename, callback) {
if (cache[filename]) {
//invoked synchronously
callback(cache[filename]);
} else {
//asynchronous function
fs.readFile(filename, 'utf8', function(err, data) {
cache[filename] = data;
callback(data);
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
function createFileReader(filename) {
var listeners = [];
inconsistentRead(filename, function(value) {
listeners.forEach(function(listener) {
listener(value);
});
});
return {
onDataReady: function(listener) {
listeners.push(listener);
}
};
}
Run Code Online (Sandbox Code Playgroud)
和它的用法:
var reader1 = createFileReader('data.txt');
reader1.onDataReady(function(data) {
console.log('First call data: ' + data);
Run Code Online (Sandbox Code Playgroud)
作者说,如果项目在缓存中,则行为是同步的,如果不在缓存中则是异步的.我很好.然后他继续说我们应该同步或异步.我很好.
我不明白的是,如果我采用异步路径,那么当 …
zalgo ×10
unicode ×8
html ×3
diacritics ×2
javascript ×2
asynchronous ×1
browser ×1
c# ×1
css ×1
node.js ×1
sanitize ×1
user-input ×1
utf-8 ×1
validation ×1