Как «проверить» человеческие имена в CakePHP? - PullRequest
2 голосов
/ 04 октября 2010

У меня есть PHP-скрипт, который должен проверять «правильные» имена людей, но недавно взломал имя с пробелом, поэтому мы добавили пробелы в наш валидатор.
Вместо того, чтобы сделать это, есть ли способдобавить черный список в валидатор CakePHP, чтобы заблокировать все «недействительные» символы, вместо того, чтобы разрешать «действительные» символы?

ПРИМЕЧАНИЕ. Я знаю, как это сделать в PHP (в целом), но использование синтаксиса валидатора CakePHP отличается.

Ответы [ 4 ]

15 голосов
/ 04 октября 2010

Я согласен с другими комментариями, что проверка имени, вероятно, является плохой идеей.

Практически для всего, что вы можете придумать для проверки, найдется человек с именем, нарушающим ваше правило.Если вы довольны идеей, что вы будете блокировать ввод реальных имен настоящими людьми, вы можете проверить их столько, сколько захотите.Но чем больше правил проверки вы введете, тем больше у вас шансов найти настоящего человека, который не сможет войти.

Вот ссылка на страницу, которая описывает некоторые из очевидных (и не столь очевидных)вещи, которые люди пытаются проверить, которые могут сбить их с толку:

http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/

Если вы хотите разрешить кого-нибудь на ваш сайт, то лучшее, что вы можете действительноНадеемся, что максимальная длина поля будет соответствовать пространству, выделенному в вашей базе данных.Даже тогда вы будете кого-то раздражать.

8 голосов
/ 04 октября 2010

Нет способа "проверить".Как можно помешать кому-то по-настоящему позвонить:

Роберт ');DROP TABLE Студенты;-

http://xkcd.com/327/


РЕДАКТИРОВАТЬ: Я имею в виду, что в некоторых странах люди могут иметь свое имя на другом языке (скажем,Японский, китайский, корейский) и даже может содержать символы. Как вы будете думать, если сайт говорит, что ваше имя "НЕДОПУСТИМО", когда он вводит свои настоящие имена?

4 голосов
/ 04 октября 2010

Проверка пользовательских регулярных выражений

var $validate = array(
    'name' => array(
        'rule' => '/^[^%#\/*@!...other characters you don\'t want...]+$/',  
        'message' => 'Only letters and integers, min 3 characters'
    )
);

Это слишком наивный подход, поскольку вам придется заносить в черный список почти весь диапазон символов Юникода. Вы можете в значительной степени сделать только белый список основных латинских символов плюс общие причуды как пробелы и апострофы. Более того, и вы будете сражаться в тяжелом сражении, которое вы не можете выиграть. Возможно, со временем вы сможете создать достаточно хороший алгоритм, но он никогда не будет на 100% надежным. Поэтому либо ограничьте пользователей базовыми латинскими именами (и не надейтесь на отчуждение вашей аудитории), либо полностью пропустите проверку *.

* Или потратьте несколько лет на разработку алгоритма, охватывающего <100% имен людей, работающих в 99,9% случаев. </sub>

4 голосов
/ 04 октября 2010

Не делайте никаких предположений о том, как имя может быть написано. Примите любой ввод (да, любой ) и выполните правильное экранирование при его отображении, чтобы не получить уязвимости XSS.

Я бы посоветовал вам сделать это в модели afterFind (), чтобы вы не забыли об этом. Сохраните исходные данные в отдельном поле модели, например ['unescaped_name'], если вам нужен доступ к простым данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...