我有这个相对简单的用户名正则表达式
// Enforce that username has to be 3-100 characters, alphanumeric, and first character a letter.
// Possibility without begin/end characters and i: [a-z][a-z0-9@.+-_]{2,100}
// Allow for simple email usernames in the future...
return !!preg_match('#^[a-zA-Z][a-zA-Z0-9@.+-_]{2,100}$#', trim($username));
不幸的是,它允许这些 XSS-ready 测试字符串:
'angle<bracket',
'angle>bracket',
'html<script>inside',
我不知道为什么,因为它们已经被正则表达式明确禁止。
这是一个正在运行的测试用例:
有人知道为什么没有明确允许使用尖括号的正则表达式允许使用尖括号吗?我是否应该将其中一个字符 (.+-) 转义为文字?
最佳答案
+-_
是你的问题。您需要转义字符类中的 -
或将其移动到类的末尾或开头。
例如:
/^[a-z][a-z0-9@.+_-]{2,100}\z/i
关于php - preg_match 用户名验证正则表达式允许 > 和 < 尽管这些字符未列入白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996951/