【发布时间】:2012-04-03 15:53:30
【问题描述】:
我有这个相对简单的用户名正则表达式
// 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',
我不知道为什么,因为它们已经被正则表达式明确禁止。
这是一个正在运行的测试用例:
谁知道为什么尖括号被一个没有明确允许的正则表达式允许?我应该将其中一个字符 (.+-) 转义为文字吗?
【问题讨论】:
-
使用明确的
(bool)演员而不是!!- 双重不是不好的做法,因为它的用途并不总是很明显。
标签: php regex preg-match