preg_match регулярное выражение проверки имени пользователя позволяет> и <несмотря на то, что эти символы не включены в белый список - PullRequest
2 голосов
/ 03 апреля 2012

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

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

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

И я понятия не имею, почему, поскольку они уже должны быть явно запрещены регулярным выражением.

Вот текущий тестовый пример:

http://ideone.com/od7dj

Кто-нибудь знает, почему угловые скобки разрешены регулярным выражением, которое явно не допускает их? Я должен экранировать один из этих символов (. + -) как литералы?

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

+-_ ваша проблема. Вам нужно экранировать - в классе персонажей или переместить его в конец или начало класса.

Например:

/^[a-z][a-z0-9@.+_-]{2,100}\z/i
2 голосов
/ 03 апреля 2012

Я думаю, что это из-за этого: [+-_]

Вы включаете все символы между '+' и '_', попробуйте изменить порядок на [+_-] (поставив черту в конце) илисбежать от тире.

...