我有一个简单的cakephp表单,带有验证,提交给数据库。它不需要登录用户。
通常不会通过浏览器使用表单而不填写所有必填字段会导致验证错误,并且表单未提交。
然而,我似乎被某人/某事发了垃圾邮件。他们正在填写通用的命名字段(名称,电子邮件,消息等),但不填写模糊的字段,这些记录将进入数据库,因此它们显然绕过了验证!
我的问题是怎么样? (我怎么能阻止他们?)
我觉得我错过了一个明显的循环漏洞......
这是我的添加方法:
function add() {
$this->pageTitle = 'Projects - Submit Project';
if (!empty($this->data)) {
$this->Project->create();
if ($this->Project->save($this->data)) {
$this->Session->setFlash(__('The Project has been saved', true));
$this->_sendStaffMail($this->Project->id);
$this->_sendClientMail($this->Project->id);
$this->redirect(array('controller' => 'pages', 'action'=>'thanks'));
} else {
$this->Session->setFlash(__('The Project could not be saved. Please, try again.', true));
}
}
}
从模型验证:
var $validate = array(
'name' => array('notempty'),
'department' => array('notempty'),
'client' => array('notempty'),
'contact_name' => array('notempty'),
'email' => array('email'),
'phone' => array('notempty'),
'title' => array('notempty'),
'background' => array('notempty'),
'objectives' => array('notempty'),
'target_audience' => array('notempty'),
'message' => array('notempty'),
'logos' => array('notempty'),
'images' => array('notempty'),
'print_info' => array('notempty')
);
我还应该提到我已经尝试过使用安全组件,但是当我的项目中有大量的表单时(例如,他们落后于Auth登录),它似乎过度杀人了。
答案 0 :(得分:3)
我猜测垃圾邮件发送者传递的帖子数据不包含target_audience这样的字段,而且当模型保存时,Cake没有验证它。
您要做的是添加“必需”验证规则。
'empty'规则只检查数据是否在数据数组中传递它不是空格,'required'确保在保存模型之前该字段实际存在。
答案 1 :(得分:3)
您需要扩展验证数组,以包含比简单语法允许的更多选项。
<?php
public $validate = array(
'name' => array(
'nameNotEmpty' => array(
'required' => true, // make sure the $data[ 'Model' ][ 'name' ] key exists
'allowEmpty' => false, // make sure the $data[ 'Model' ][ 'name' ] value exists
'rule' => array( 'notEmpty' ), // make sure the value isn't empty.
'message' => 'Name is required.',
),
),
);
?>
对规则的评论应该解释为什么每个键都在那里。 notEmpty规则和allowEmpty =&gt; false是多余的,但我想在声明中使用一条规则,以便您在那里看到密钥并记住用适当的验证规则替换它(isUnique,minLength等)
已编辑:更多信息
基本上发生的事情是有人直接向表单操作发布请求,其中包含带有明显键的post数组。根据您的验证规则,如果省略某些更具体信息的密钥,则不会对这些字段进行验证检查。为了使蛋糕不仅验证密钥的数据,而且还验证密钥本身的存在,使用required =&gt;真旗。如果密钥也必须不包含空格或空值(required =&gt; true,只需确保字段包含在表单中),则使用allowEmpty =&gt;假的。
答案 2 :(得分:0)
我在这里一般都在谈论(即没有具体的CakePHP),但值得考虑的是验证码领域吗?
那么mollom反垃圾邮件服务呢?对于那些拥有大量流量的网站运营商而言,这是免费的。适用于任何CMS。
答案 3 :(得分:0)
您的CakePHP是否接受安全性或证明 - 用户是人类的问题是可选参数参数?通过从客户端表单传递到服务器的HTTP Form POST CGI参数数据,查看CakePHP所执行的操作(即执行流向何处,运行PHP代码)。
您的数据库登录名/密码是否足够安全?