我有一个PHP脚本应该检查“有效”的人名,但最近针对带有空格的名称进行了破解,所以我们在验证器中添加了空格。
有没有办法在CakePHP的验证器中添加黑名单来阻止所有“无效”字符,而不是允许“有效”字符?
注意:我知道如何在PHP(通常)中执行此操作,但使用CakePHP的验证器语法是不同的。
答案 0 :(得分:15)
我同意其他评论,验证名称可能是一个坏主意。
对于您可以想到要验证的几乎所有内容,会有一个名字违反规则的人。如果您对阻止真人输入姓名的想法感到满意,那么您可以根据自己的喜好对其进行验证。但是你输入的验证规则越多,就越有可能找到一个无法登录的真人。
这是一个页面的链接,它描述了人们试图验证的一些显而易见的(并不是那么明显)的事情,这些事情可能会使它们绊倒:
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
如果您想允许任何人进入您的网站,那么您真正希望的最好方法是强制最大字段长度以适应您在数据库中分配的空间。即便如此,你也会惹恼别人。
答案 1 :(得分:8)
无法“验证”。你怎么能阻止有人打电话:
罗伯特'); DROP TABLE学生; -
编辑:我的意思是,某些国家/地区的人可能会使用不同语言(例如日语,中文,韩语),甚至可能包含符号。 如果某个网站在输入他们的真实姓名时说你的名字是“无效”,你会怎么想?
答案 2 :(得分:4)
不要对名称的拼写方式做任何假设。接受任何输入(是的,任何),并在显示时进行适当的转义,这样就不会出现XSS漏洞。
我建议你在afterFind()的模型中进行这个转义,所以你不要忘记它在某个地方。如果需要访问普通数据,请将原始数据保存在模型的单独字段中,如['unescaped_name']。
答案 3 :(得分: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%万无一失。因此,要么将用户限制为基本的拉丁名称(并希望不要疏远您的受众群体),要么完全跳过验证{。{1}}。
*
或投入几年时间开发一种涵盖<100%人名的算法,99.9%的时间工作。