确保用户名不是保留字的最佳方法是什么?

时间:2009-06-03 08:38:32

标签: validation

假设我正在构建一个Web应用程序,其用户页面可以在http://example.com/ NAME找到。确保用户名不与保留字(例如'about','contact'等)冲突的最佳方法是什么?我可以想到两种方式:

  • 在我的代码中的某个位置维护一个列表。这很棒,但是如果我决定将“关于”页面更改为“aboutus”,我必须编辑另一段代码。
  • 请求URI(例如http://example.com/someusername)并检查它是否存在(不返回404)。这感觉有点像黑客,但另一方面它完全符合它的预期。另一方面,如果不为它制作页面,我就无法保留任何内容。

最好的方法是什么?手动验证用户名不是一种选择。谢谢!

编辑:我忘了提及,用户名在根目录下,如下所示:

  

http://example.com/USERNAME

不喜欢这样:

  

http://example.com/users/USERNAME

因此我为什么要问这个问题。这是出于技术原因,不要问。

9 个答案:

答案 0 :(得分:5)

我强烈建议您使用http://example.com/users/NAME等唯一路径。否则,如果要添加保留字,您打算做什么,但用户已将其作为用户名?你最终会遇到各种潜在的迁移问题。

或者,如果您必须直接关闭http://example.com/,可以为所有用户名添加前缀吗?那么用户jerryjvl会转换为链接http://example.com/user_jerryjvl

如果确实没有其他可能的解决方案,那么我会说要么根据任何数据源检查用户名来确定“保留字”是什么,要么在某处包含所有保留字的查找文件/表/结构

答案 1 :(得分:2)

如何更改路由方案,以便用户访问example.com/users/NAME?

答案 2 :(得分:2)

为了完整性,如果您无法更改路由。另一种可能性是让您的用户路由和非用户路由具有程序性区别。例如,如果您在每条用户路线的末尾添加了'_',那么您可以确保用户位于:http://example.com/NAME_,而另一条路径永远不会在{{1}中结束}

答案 3 :(得分:2)

我在代码中维护保留字。 这是我在http://postbit.com/网站中使用的PERL代码,用于检查用户名是否为保留字:

# 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

答案 4 :(得分:1)

你只知道这些'保留'字样是什么。因此,最好维护一个列表并对其进行验证。

另一种方法是,如果您使用CMS,那么所有这些关于'','联系'等关键字将在您的数据库中存在。验证它。

答案 5 :(得分:1)

如何首先使用所有保留字创建虚拟帐户?只列出所有可能的并创建它们。

如果您使用

www.example.com/user/name 

然后就没有问题,但似乎你希望网址很短。

答案 6 :(得分:1)

文本框旁边的内容如下:“请使用您的个人昵称或您的真实姓名。可能会撤销表示与网站管理关联的常用字词的用户名”。

答案 7 :(得分:1)

  

在我的代码中的某处保留一个列表。这很好,但是如果我决定将“关于”页面更改为“aboutus”,那么我需要编辑另一段代码。

您的菜单应存储在数组/列表中。这样你只需编辑一段代码,而不是2. =]

然后,由于所有菜单都在一个数组中,因此您可以将username与数组中的元素进行匹配。 例如

$menu = array('About', 'Contact', 'Home')
if( in_array($username, $menu) ) {
  echo 'invalid username'
}

答案 8 :(得分:0)

您可以随时查看stackoverflow.com的工作原理。