2010-10-04 64 views
2

我有一个PHP脚本,应该检查“有效”的人名,但最近对空间名称进行了破解,所以我们向验证器添加了空格。
有没有办法将一个黑名单添加到CakePHP的验证器来阻止所有“无效”字符,而不是允许“有效”字符?如何在CakePHP中“验证”人名?

注意:我知道如何在PHP中执行此操作(通常),但使用CakePHP的验证器语法是不同的。

+4

将人名分类为*有效*的是什么?这似乎是一个相当武断的术语来解决。你会将带有口音的字母归类为无效吗? – 2010-10-04 07:38:50

+0

这个想法是系统将基于“有效”和“真实”的人名,所以我们会尽量避免太多会削弱系统信任的特殊字符。 – chustar 2010-10-04 07:41:28

+0

我加了引号,表明我明白我所问的是多么模糊。 – chustar 2010-10-04 07:42:51

回答

15

我同意其他意见,验证名称可能是一个坏主意。

对于几乎所有你可以想到验证的东西,都会有一个名字违背你的规则的人。如果您对于阻止真人进入他们的名字的想法感到满意,那么您可以尽可能多地验证它。但是,您输入的验证规则越多,您就越可能找到无法登录的真实用户。

下面是页面的链接,介绍了一些明显的(和不那么明显)的东西,人们尝试验证,它可以绊倒起来:如果你想允许

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

任何人到你的网站上,那么你真正希望的最好的办法是强制一个最大字段长度来适应你在数据库中分配的空间。即使那样你也会惹恼某个人。

+4

+1非常棒的链接,谢谢! – deceze 2010-10-04 09:25:13

4

不要对名称如何拼写做任何假设。接受任何输入(是的,任何),并在显示时进行适当的转义,因此您不会收到XSS漏洞。

我建议你这样做在afterFind()模型中逃脱,所以你不要忘记它的地方。如果您需要访问普通数据,请将原始数据保存在模型的单独字段中,如['unescaped_name']。

4

Custom Regular Expression Validation

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

这是太天真了,虽然办法,因为你将不得不黑名单几乎Unicode字符的整个范围。你几乎只能做基本拉丁字符的白名单,加上空格和撇号等常见的怪癖。除此之外,你会打一场难以胜利的艰苦战斗。随着时间的推移,您可能会创建一个相当不错的算法,但它永远不会百分之百安全。所以要么限制你的用户使用基本的拉丁名字(并且希望不要疏远你的听众),要么完全跳过验证*

*或投入几年的时间开发一个算法,覆盖人名的100%,工作99.9%的时间。

8

没有办法“验证”。你怎样才能防止真正被叫的人:

Robert'); DROP TABLE学生; -

http://xkcd.com/327/


编辑:我真正的意思是,人们在一些国家可能在不同的语言有自己的名字(比如日本,中国,韩国)甚至可能包含符号。 如果某个网站在输入真实姓名时称您的名字“无效”,您会如何看待?