Я бы действительно сказал: не пытайтесь проверять имена: рано или поздно ваш код встретит имя, которое он считает «неправильным». >ваше имя неверно" ?
В зависимости от того, чего вы действительно хотите достичь, вы можете рассмотреть возможность использования какого-либо черного списка / фильтров, чтобы исключить «не-имена», о которых вы думали: это, возможно, пропустит некоторые «плохие имена», но, по крайней мере, это не должен препятствовать доступу любого существующего имени к вашему приложению.
Вот несколько примеров правил, которые приходят на ум:
- нет номера
- нет специального символа, например
"~{()}@^$%?;:/*§£ø
и, возможно, некоторых других
- не более 3 пробелов?
- none of "admin", "support", "moderator", "test", and a few other obvious non-names that people tend to use when they don't want to type in their real name...
- (but, if they don't want to give you their name, their still won't, even if you forbid them from typing some random letters, they could just use a real name... Which is not their's)
Да, это не идеально; и да, это пропустит некоторые не имена... Но, вероятно, это намного лучше для вашего приложения, чем говорить кому-то "ваше имя неправильно" (да, я настаиваю ^^ )
И, чтобы ответить на комментарий, который вы оставили под другим ответом:
Я мог бы просто запретить большинство командных символов для SQL-инъекций и XSS-атак,
Что касается SQL-инъекций, вы должны экранировать свои данные перед отправкой их в базу данных; и, если вы всегда экранируете эти данные (вы должны!), вам не нужно заботиться о том, что пользователи могут вводить или нет: поскольку они всегда экранируются, для вас нет риска.
То же самое с XSS: поскольку вы всегда избегаете своих данных при их выводе (вы должны!), нет риска инъекции ;-)
EDIT: если вы просто используете это регулярное выражение, оно не будет работать достаточно хорошо:
Следующий код:
$rexSafety = "/^[^<,\"@/{}()*$%?=>:|;#]*$/i";
if (preg_match($rexSafety, 'martin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
Вы получите хотя бы предупреждение:
Warning: preg_match() [function.preg-match]: Unknown modifier '{'
Вы должны экранировать по крайней мере некоторые из этих специальных символов; Я позволю вам изучить Шаблоны PCRE для получения дополнительной информации (здесь действительно много нужно знать о PCRE/регулярных выражениях, и я не смогу все объяснить)
Если вы действительно хотите проверить, что ни один из этих символов не находится внутри данного фрагмента данных, вы можете получить что-то вроде этого:
$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'martin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
(Это быстрое и грязное предложение, которое нужно уточнить!)
На этом написано "ОК" (ну, я очень надеюсь, что мое собственное имя подойдет!)
И тот же пример с некоторыми специальными символами, например:
$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'ma{rtin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
Скажет "плохое имя"
Но учтите, что я не полностью протестировал это, и, вероятно, требуется дополнительная работа! Не используйте это на своем сайте, если вы не протестировали его очень тщательно!
Также обратите внимание, что одинарная кавычка может быть полезна при попытке выполнить SQL-инъекцию... Но, вероятно, это символ, допустимый в некоторых именах... Таким образом, простого исключения некоторых символов может быть недостаточно ;-)
person
Pascal MARTIN
schedule
11.08.2009