У меня есть это относительно простое регулярное выражение для имен пользователей
// Enforce that username has to be 3-100 characters, alphanumeric, and first character a letter. // Possibility without begin/end characters and i: [az][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:
'angle<bracket', 'angle>bracket', 'html<script>inside',
И я не знаю, почему, поскольку они уже должны быть явно запрещены регулярным выражением.
Вот пример проверки:
http://ideone.com/od7dj
Кто-нибудь знает, почему угловые скобки допускаются регулярным выражением, которое явно не допускает их? Должен ли я избегать одного из этих персонажей (. + -) в качестве литералов?
Я думаю, это из-за этого: [+-_]
Вы включаете все символы между «+» и «_», попробуйте изменить порядок на [+_-]
(помещая тире в конец) или выйдите из тире.
+-_
– ваша проблема. Вам нужно избежать -
в классе символов или переместить его в конец или начало класса.
Например:
/^[az][a-z0-9@.+_-]{2,100}\z/i