Лучший способ убедиться, что имя пользователя не является зарезервированным словом? - PullRequest
4 голосов
/ 03 июня 2009

Допустим, я создаю веб-приложение, пользовательские страницы которого можно найти по адресу http://example.com/NAME. Как лучше всего убедиться, что имя пользователя не конфликтует с зарезервированным словом (например, «о», «контакт» ', так далее.)? Я могу придумать два пути:

  • Вести список где-нибудь в моем коде. Это здорово и все, но означает, что у меня есть еще один фрагмент кода, который мне нужно отредактировать, если я решу, скажем, изменить страницу "about" на "aboutus".
  • Запросите URI (например, http://example.com/someusername) и проверьте, существует ли он (не возвращает 404). Это похоже на взлом, но, с другой стороны, он делает именно то, что должен делать. С другой стороны, я ничего не могу зарезервировать, не сделав для этого страницу.

Как лучше всего это сделать? Ручная проверка имен пользователей не вариант. Спасибо!

РЕДАКТИРОВАТЬ: Я забыл упомянуть, имя пользователя имеет для доступа к корню, как это:

http://example.com/USERNAME

Не так:

http://example.com/users/USERNAME

Поэтому я задаю этот вопрос. Это по техническим причинам, не спрашивайте.

Ответы [ 9 ]

5 голосов
/ 03 июня 2009

Я бы настоятельно рекомендовал использовать вместо этого уникальный путь, например http://example.com/users/NAME. В противном случае, что вы собираетесь делать, если хотите добавить зарезервированное слово, но пользователь уже принял его как свое имя пользователя? Вы столкнетесь со всевозможными проблемами миграции в будущем.

В качестве альтернативы, если у вас есть что-то, что идет прямо с http://example.com/, не могли бы вы префикс всех имен пользователей? Так что пользователь jerryjvl будет переводить ссылку http://example.com/user_jerryjvl?

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

2 голосов
/ 15 сентября 2011

Я поддерживаю зарезервированные слова внутри кода. Это код PERL, который я использую на веб-сайте http://postbit.com/, чтобы проверить, является ли имя пользователя зарезервированным словом:

# Black list of logins and sub-domains reserved keywords
my @black_list = qw(
  about access account accounts add address adm admin administration
  adult advertising affiliate affiliates ajax analytics android anon
  anonymous api app apps archive atom auth authentication
  ...
);

my $username_normalized = lc($username);
   $username_normalized =~ s/\W//gs; # 'log-in' -> 'login'

for my $this_username (@black_list) {
  if ($username_normalized eq $this_username) {
    die("This username is already taken. Please choose other username.\n");
  }
}

Полный список зарезервированных имен (таких как 'css', 'images', 'js', 'admin', 'root', 'old', 'test', 'www', 'admin', 'login' , 'devel' ...) с более чем 300 именами для входа в систему размещено здесь:

http://blog.postbit.com/reserved-username-list.html

2 голосов
/ 03 июня 2009

В интересах полноты, если вы не можете изменить маршрут. Другая возможность состоит в том, чтобы иметь ваши пользовательские маршруты, а ваши не пользовательские маршруты имеют программное различие. Например, если вы добавили '_' в конец каждого из ваших пользовательских маршрутов, то вы можете убедиться, что пользователи расположены по адресу: http://example.com/NAME_, а другой маршрут никогда не будет заканчиваться на '_'* 1005. *

2 голосов
/ 03 июня 2009

Как насчет изменения схемы маршрутизации, чтобы пользователи находились по адресу example.com/users/NAME?

1 голос
/ 12 июня 2009

Вести список где-нибудь в моем коде. Это здорово и все, но означает, что у меня есть еще один кусок кода, который я должен отредактировать, если я решу, скажем, изменить страницу "about" на "aboutus".

Ваши меню должны храниться в массиве / списке. Таким образом, у вас будет только 1 кусок кода для редактирования, а не 2. =]

Тогда, поскольку все меню находятся в одном массиве, вы можете сопоставить имя пользователя с элементами в массиве. например

$menu = array('About', 'Contact', 'Home')
if( in_array($username, $menu) ) {
  echo 'invalid username'
}
1 голос
/ 03 июня 2009

Прямо рядом с текстовым полем что-то вроде: «Пожалуйста, используйте ваш личный ник или ваше настоящее имя. Имена пользователей с общими словами, указывающими на принадлежность к администрации сайта, могут быть отменены».

1 голос
/ 03 июня 2009

Как насчет того, чтобы сначала создать фиктивные аккаунты со всеми резервными словами? просто перечислите все возможные и создайте их.

если вы используете

www.example.com/user/name 

тогда проблем не будет, но кажется, что вы хотите, чтобы URL был коротким.

1 голос
/ 03 июня 2009

Вы знаете только, что это зарезервированные слова. Так что лучше ведите список и проверяйте его.

Другой способ будет, если вы используете CMS, тогда все эти ключевые слова "about", "contact" и т. Д. Будут в вашей базе данных. Подтвердите против него.

0 голосов
/ 03 июня 2009

Вы всегда можете посмотреть, как работает stackoverflow.com .

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