繁体   English   中英

如何在CakePHP中“验证”人名?

[英]How to “Validate” Human Names in CakePHP?

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

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

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

对于您可以想到要验证的几乎所有内容,会有一个名称违反规则的人。 如果您对阻止真人输入姓名的想法感到满意,那么您可以根据自己的喜好对其进行验证。 但是你输入的验证规则越多,你就越有可能找到一个无法登录的真人。

这是一个页面的链接,它描述了一些人们试图验证的明显(而不是那么明显)的东西,这些东西可以绊倒它们:

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

如果您想允许任何人访问您的网站,那么您真正希望的最好方法是强制最大字段长度以适合您在数据库中分配的空间。 即便如此,你也会惹恼别人。

没有办法“验证”。 你怎么能阻止有人打电话:

罗伯特'); DROP TABLE学生; -

http://xkcd.com/327/


编辑:我的意思是,一些国家的人可能会用不同的语言(比如日语,中文,韩语),甚至可能包含符号。 如果一个网站在他/她输入真实姓名时说你的名字是“无效”,你会怎么想?

不要对名称的拼写方式做任何假设。 接受任何输入(是的, 任何 ),并做适当的转义显示它的时候,所以你没有得到XSS漏洞。

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

自定义正则表达式验证

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

这是一种过于天真的方法,因为你必须将几乎所有Unicode字符列入黑名单。 你几乎只能将基本的拉丁字符加上白名单加上常见的怪癖,如空格和撇号。 除此之外,你还要打一场你无法获胜的艰苦战斗。 您可以随着时间的推移创建一个相当不错的算法,但它永远不会100%万无一失。 因此,要么限制用户使用基本的拉丁名称(并希望不要疏远您的受众),要么完全跳过验证*

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM