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

标签 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));

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

'angle<bracket',
'angle>bracket',
'html<script>inside',

我不知道为什么,因为它们已经被正则表达式明确禁止。

这是一个正在运行的测试用例:

http://ideone.com/od7dj

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

最佳答案

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

例如:

/^[a-z][a-z0-9@.+_-]{2,100}\z/i

关于php - preg_match 用户名验证正则表达式允许 > 和 < 尽管这些字符未列入白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996951/

相关文章:

php - 如何在mysql查询中写入字符串变量?

regex - 如何从字符串中提取信息

c# - 验证日期的正则表达式 - C#

php - 每 3 秒将数据从 Flash 发送到 php

php - 用PHPExcel计算总和

php - utf-8 的 preg_match 规则

php - preg_match :print: class matches tab character

php - 循环 Preg_match 直到不再有匹配项

php - 无法使用 PHP MySQL 登录

javascript - 正则表达式到数组javascript