上图中的角色是几个月前由Mikko Hyppönen 发布的推文,他是一位以计算机病毒研究和TED计算机安全演讲而闻名的计算机安全专家。关于 SO,我只会发布它的图像,但你明白了。这显然不是您想要在您的网站上传播并吓坏访问者的东西。
经过进一步检查,该字符似乎是一个泰语字母加上超过 87 个变音符号(甚至有限制吗?!)。这让我开始思考安全性、本地化以及如何处理此类输入。我的搜索将我引向Stack 上的这个问题,然后是 Michael Kaplan 关于剥离变音符号的博客文章。在其中,他演示了如何将字符串分解为其“基本”字符(为简洁起见,此处进行了简化):
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
我可以看到这在某些情况下会有用,但就用户输入而言,它会删除所有变音符号。正如卡普兰所指出的,删除某些语言中的变音符号可以完全改变单词的含义。这就引出了一个问题:如何在用户输入/输出中允许一些变音符号,但排除其他极端情况,例如 Mikko Hyppönen 的 über 角色?