preg_match用户名验证正则表达式允许>和<尽管这些字符未被列入白名单

Kzq*_*qai 2 php regex preg-match

我有这个相对简单的用户名正则表达式

// 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));
Run Code Online (Sandbox Code Playgroud)

不幸的是,它允许这些XSS就绪测试字符串:

'angle<bracket',
'angle>bracket',
'html<script>inside',
Run Code Online (Sandbox Code Playgroud)

我不知道为什么因为他们已经明确地被正则表达式所禁止了.

这是一个运行测试用例:

http://ideone.com/od7dj

任何人都知道为什么正则表达式允许使用尖括号而没有明确允许它们?我是否应该将其中一个字符(.+ - )作为文字转义?

Qta*_*tax 6

+-_是你的问题.您需要转义-字符类或将其移动到类的结尾或开头.

例如:

/^[a-z][a-z0-9@.+_-]{2,100}\z/i
Run Code Online (Sandbox Code Playgroud)