1

我有一个简单的 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')

);

我还应该提到我曾尝试使用 Security 组件,但是当我的项目中包含大量表单时,它似乎已经过时了(尽管它们落后于 Auth 登录)

4

4 回答 4

3

我猜垃圾邮件发送者传递的帖子数据不包含诸如 target_audience 之类的字段,因此在保存模型时,Cake 没有验证它。

您要做的是添加“必需”验证规则。

“空”规则仅检查是否在数据数组中传递的值不是空格,“必需”确保该字段在模型保存之前实际存在。

于 2009-12-10T17:21:14.663 回答
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 => false 是多余的,但我想在声明中添加一条规则,以便您可以看到其中的密钥并记住将其替换为适当的验证规则(isUnique、minLength 等)

已编辑:更多信息

基本上正在发生的事情是有人直接向表单操作发布请求,其中包括带有明显键的发布数组。根据您的验证规则,如果省略了某些更具体信息的键,则不会对这些字段进行验证检查。要使 cake 不仅验证密钥的数据,而且验证密钥本身的存在,请使用 required => true 标志。如果键也不能只包含空格或空值( required => true 只是确保该字段包含在表单中),则使用 allowEmpty => false。

于 2009-12-10T18:46:51.870 回答
0

我在这里说的很笼统(即不是特定于CakePHP),但是验证码字段值得考虑吗?

此外,mollom 反垃圾邮件服务又如何呢?这对许多网站运营商免费,但那些流量很大的网站运营商除外。适用于任何 CMS。

于 2009-12-10T16:18:18.603 回答
0

您的 CakePHP 是否接受安全或证明用户是人的问题作为可选参数参数?看看 CakePHP 做了什么(即执行流向何处,运行什么 PHP 代码),将 HTTP 表单 POST CGI 参数数据从您的客户端表单传递到您的服务器。

您的数据库登录名/密码是否足够安全?

于 2009-12-10T16:52:37.207 回答