У меня есть PHP-скрипт, который должен проверять «действительные» имена людей, но недавно взломан на имя с пробелом, поэтому мы добавили пробелы в наш валидатор.
Вместо того, чтобы делать это, есть ли способ добавить черный список к валидатору CakePHP для блокировки всех «недопустимых» символов, вместо того, чтобы разрешать «действительные»?
ПРИМЕЧАНИЕ. Я знаю, как это сделать в PHP (обычно), но использование синтаксиса синтаксиса CakePHP отличается.
Я согласен с другими комментариями, что проверка имени – это, вероятно, плохая идея.
Практически все, что вы можете придумать для проверки, будет кто-то с именем, нарушающим ваше правило. Если вы довольны идеей, что вы собираетесь блокировать реальных людей от ввода их имен, то вы можете проверить его столько, сколько хотите. Но чем больше правил проверки вы вводите, тем больше вероятность того, что вы найдете настоящего человека, который не может войти в систему.
Вот ссылка на страницу, в которой описываются некоторые из очевидных (и не столь очевидных) вещей, которые люди пытаются проверить, что может их разбить:
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
Если вы хотите разрешить кому бы то ни было на вашем сайте, то лучше всего вы можете надеяться, это заставить максимальную длину поля соответствовать пространству, которое вы выделили в своей базе данных. Даже тогда вы будете кого-то раздражать.
Невозможно «подтвердить». Как вы можете запретить кому-то действительно позвонить:
Роберт'); DROP TABLE Студенты; –
EDIT: Я действительно имею в виду, что люди в некоторых странах могут иметь свое имя на разных языках (например, японский, китайский, корейский) и даже могут содержать символы. Как вы думаете, если сайт говорит, что ваше имя «INVALID», когда он вводит свои настоящие имена?
Не делайте никаких предположений о том, как имя может быть записано. Примите любой ввод (да, любой ) и выполните правильное экранирование при его отображении, так что вы не получите уязвимостей XSS.
Я предлагаю вам сделать это в модели на afterFind (), поэтому вы не забудете его где-нибудь. Сохраните исходные данные в отдельном поле модели, например ['unescaped_name'], если вам нужно получить доступ к простым данным.
Пользовательская проверка регулярного выражения
var $validate = array( 'name' => array( 'rule' => '/^[^%#\/*@!...other characters you don\'t want...]+$/', 'message' => 'Only letters and integers, min 3 characters' ) );
Это слишком наивный подход, хотя, как вам пришлось бы в черный список почти весь спектр символов Юникода. Вы можете в значительной степени использовать белый список основных латинских символов, а также общие причуды, такие как пробелы и апострофы. Более того, и вы будете сражаться в гору, которую вы не сможете победить. С течением времени вы сможете создать достаточно хороший алгоритм, но он никогда не будет на 100% надежным. Поэтому либо ограничивайте пользователей базовыми латинскими именами (и надейтесь не отчуждать аудиторию), либо полностью пропустите проверку. *
.
*
Или инвестируйте несколько лет в разработку алгоритма, охватывающего <100% человеческих имен, работающих в 99,9% случаев.