Cakephp CSRF保护

时间:2016-02-01 02:49:05

标签: cakephp csrf-protection

我是cakephp的新手,现在我正在研究带有cakephp的新项目。我目前正在做的任务是为整个项目做CSRF保护。我已经阅读了官方的cakephp 2 cookbook,我按照那本书中的解释做了。但是,现在我正面临

“请求已被黑洞了。 错误:在此服务器上找不到请求的地址'/ admin / accounts / add'。“每次提交新用户添加表单时。 我的代码是:

public $components = array(
        'Security' => array(
            'csrfExpires' => '+1 hour'
            ),
        'Search.Prg' => array(
            'commonProcess' => array(
                'paramType' => 'named',
                'filterEmpty' => true
            ))


        );

public function beforeFilter() {
        parent::beforeFilter();
        $this->layout = 'admin';
        $this->Security->blackHoleCallback = '_blackHole';
    }

public function _blackHole($error) {
        die($error);
    }

通过这样做,出现了'auth'错误。

这是我的观看代码。

<div class="">
    <div class="clearfix"></div>
    <div class="row">
        <div class="col-md-12 col-sm-12 col-xs-12">
            <?php echo $this->Session->flash(); ?>
            <div class="x_panel">
                <div class="x_title">
                    <h2>アカウント登録</h2>
                    <div class="clearfix"></div>
                </div>
                <div class="x_content">
                <br />
                <?php echo $this->Form->create('MasterUser', array('class' => 'form-horizontal form-label-left', 'inputDefaults' => array('label' => false, 'div' => false), 'id' => 'demo-form', 'autocomplete' => 'off')); ?>

                        <div class="form-group">
                            <?php echo $this->Form->label('last_name', '姓 <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-2 col-sm-2 col-xs-12">
                                <?php echo $this->Form->input('last_name', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>

                            <?php echo $this->Form->label('first_name', '名 <span class="required">*</span>', array('class' => 'control-label col-md-1 col-sm-1 col-xs-12'));?>
                            <div class="col-md-2 col-sm-2 col-xs-12">
                                <?php echo $this->Form->input('first_name', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('last_name_kana', 'セイ <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-2 col-sm-2 col-xs-12">
                                <?php echo $this->Form->input('last_name_kana', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>

                            <?php echo $this->Form->label('first_name_kana', ' メイ <span class="required">*</span>', array('class' => 'control-label col-md-1 col-sm-1 col-xs-12'));?>
                            <div class="col-md-2 col-sm-2 col-xs-12">
                                <?php echo $this->Form->input('first_name_kana', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('username', ' ログイン ID <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-5 col-sm-5 col-xs-12">
                                <?php echo $this->Form->input('username', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('mail', ' メールアドレス <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-5 col-sm-5 col-xs-12">
                                <?php echo $this->Form->input('mail', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('password', ' パスワード <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-5 col-sm-5 col-xs-12">
                                <?php echo $this->Form->input('password', array('label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('password_confirm', ' 確認用パスワード <span class="required">*</span>', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-5 col-sm-5 col-xs-12">
                                <?php echo $this->Form->input('password_confirm', array('type' => 'password', 'label' => false, 'class' => 'form-control col-md-7 col-xs-12')); ?>
                            </div>
                        </div>

                        <div class="form-group">
                            <?php echo $this->Form->label('', '', array('class' => 'control-label col-md-3 col-sm-3 col-xs-12'));?>
                            <div class="col-md-5 col-sm-5 col-xs-12">
                                <?php echo $this->Form->radio('role',array('1'=>'管理者','2'=>'編集者'), array('default' => '1', 'class' => 'flat', 'legend' => false, 'label' => false)); ?>
                            </div>
                        </div>

                        </p>

                        <div class="ln_solid"></div>

                        <div class="form-group">
                            <div class="col-md-6 col-sm-6 col-xs-12 col-md-offset-3">
                            <?php echo $this->Form->button('戻る', array('type' => 'reset', 'class' => 'btn btn-primary')); ?>
                            <?php echo $this->Form->button('削除', array('type' => 'reset', 'class' => 'btn btn-default')); ?>
                            <?php echo $this->Form->button('変更を保存', array('type' => 'submit', 'class' => 'btn btn-success')); ?>
                            </div>
                        </div>

                    <?php $this->Form->end(); ?>
                </div>
            </div>
        </div>
    </div>
</div>

我该怎么办? 请帮助我。我用谷歌搜索,但这只是浪费时间。我没办法。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

如果您尝试发送表单数据而不保留表单组件生成的隐藏标记字段,安全组件将对您的请求进行黑洞处理。

如果您要发送AJAX请求,这种情况会发生很多,解决此问题的最佳方法是简单地使用Cake Form Component创建的表单序列化并发送,而不是尝试直接通过AJAX发送离散值:

$.post('/controller/action', $('#my-form-id').serialize(), function(data) {
            result = $.parseJSON(data);
            if(!result) {
                //do Something
            } else {
                //succeeded
}

如果您通过此检查发送到Controller操作的数据,那么您将看到额外的字段,这些字段将阻止Cake Security Component对您的请求进行黑名单!

如果您没有使用AJAX,那么只需确保使用Form Helper构建表单 - 另请注意,如果您在生成表单后更改表单,那么CakePHP将对您的请求进行黑洞检查,因为它检测到表单已被篡改 - 这是为了您的安全。

如果您在黑洞请求中显示Auth错误,那么我会检查您正在访问的操作是否包含$ this-&gt; Auth-&gt; allow()(或者您已登录!),尝试将$ this-&gt; Auth-&gt; allow()放入你的beforeFilter中以检查这是原因(这个控制器禁用了Auth) - 如果是,那么你需要查看你的授权系统。

请查看以下链接:

CakePHP Security Component

CakePHP Form Helper

Restricting HTTP Methods allowed

Making Actions Public - Disabling Auth