我需要过滤一些非法字符串,例如“密码”,但我发现有人绕过了我的检查程序。他们输入了一个看起来完全是“密码”但不相等的字符串。我检查了它的Unicode,例如,“a”是8e61
,而普通的“a”是61
(十六进制)。我的 PHP 文件的编码、HTML 元 Content-Type 和 MySQL 编码是 utf-8。
这是怎么发生的?为什么视觉上相同的字符具有不同的代码?我想知道如何过滤这些字符。我把奇怪的字符串放在这里,请复制它以供研究:密码
出于某种原因,当我在这里复制有问题的“密码”时,它实际上显示的是 ASCII 码。
我在“密码”上使用 PHP 函数 bin2hex(),并得到以下信息:
50c28e61c28e73c28e73c28e776fc28e72c28e64c28e
而正常的是:
50617373776f7264.
为了简单起见,“a”的十六进制表示为:
c28e61
而正常的是:
61