preg_match имя пользователя regex validation позволяет> и <несмотря на то, что эти символы не являются белыми

У меня есть это относительно простое регулярное выражение для имен пользователей

// 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