0

この質問をする前に、他の CakeDC ユーザー プラグインに関する質問を読みました。

CakeDC ユーザー プラグインを CakePHP 2.2.3 のクリーン インストールに追加しました。最初はルーティングの問題がありましたが、ユーザー プラグイン ルーティングを構成ルーティングに移動することで、期待通りのルーティングを得ることができました。

したがって、users/users/register の代わりに、ルーティングを移動した後、users/register が機能するようになりました。

私が今抱えている問題は、レジスターにあります。電子メールが構成され、登録フォームを送信できるようになると、次のエラーが表示されます。

エラー: 要求されたアドレス '/cakeDC/users/add' がこのサーバーで見つかりませんでした。

「登録」がルーティングされる「追加」アクションは次のとおりです。

public function add() {
    if ($this->Auth->user()) {
        $this->Session->setFlash(__d('users', 'You are already registered and logged in!'));
        $this->redirect('/');
    }

    if (!empty($this->request->data)) {
        $user = $this->User->register($this->request->data);
        if ($user !== false) {
            $this->_sendVerificationEmail($this->User->data);
            $this->Session->setFlash(__d('users', 'Your account has been created. You should receive an e-mail shortly to authenticate your account. Once validated you will be able to login.'));
            $this->redirect(array('action' => 'login'));
        } else {
            unset($this->request->data[$this->modelClass]['password']);
            unset($this->request->data[$this->modelClass]['temppassword']);
            $this->Session->setFlash(__d('users', 'Your account could not be created. Please, try again.'), 'default', array('class' => 'message warning'));
        }
    }
}

フォームは次のとおりです。

<div class="users form">
    <h2><?php echo __d('users', 'Add User'); ?></h2>
    <fieldset>
        <?php
            echo $this->Form->create($model);
            echo $this->Form->input('username', array(
                'label' => __d('users', 'Username')));
            echo $this->Form->input('email', array(
                'label' => __d('users', 'E-mail (used as login)'),
                'error' => array('isValid' => __d('users', 'Must be a valid email address'),
                'isUnique' => __d('users', 'An account with that email already exists'))));
            echo $this->Form->input('password', array(
                'label' => __d('users', 'Password'),
                'type' => 'password'));
            echo $this->Form->input('temppassword', array(
                'label' => __d('users', 'Password (confirm)'),
                'type' => 'password'));
            $tosLink = $this->Html->link(__d('users', 'Terms of Service'), array('controller' => 'pages', 'action' => 'tos'));
            echo $this->Form->input('tos', array(
                'label' => __d('users', 'I have read and agreed to ') . $tosLink));
            echo $this->Form->end(__d('users', 'Submit'));
        ?>
    </fieldset>
</div>

スタック トレースの情報は次のとおりです。

CORE\Cake\Controller\Component\SecurityComponent.php 行 232

    }
    if ($isPost && $isNotRequestAction && $this->csrfCheck) {
        if ($this->_validateCsrf($controller) === false) {
            return $this->blackHole($controller, 'csrf');
        }

SecurityComponent->blackHole(UsersController, 文字列)

object(UsersController) {
    name => 'Users'
    helpers => array(
        [maximum depth reached]
    )
    components => array(
        [maximum depth reached]
    )
    presetVars => array(
        [maximum depth reached]
    )
    uses => array(
        [maximum depth reached]
    )
    request => object(CakeRequest) {}
    response => object(CakeResponse) {}
    viewPath => 'Users'
    layoutPath => null
    viewVars => array(
        [maximum depth reached]
    )
    view => 'add'
    layout => 'default'
    autoRender => true
    autoLayout => true
    Components => object(ComponentCollection) {}
    viewClass => 'View'
    View => null
    ext => '.ctp'
    plugin => 'Users'
    cacheAction => false
    passedArgs => array([maximum depth reached])
    scaffold => false
    methods => array(
        [maximum depth reached]
    )
    modelClass => 'User'
    modelKey => 'user'
    validationErrors => null
    Session => object(SessionComponent) {}
    Auth => object(AuthComponent) {}
    Cookie => object(CookieComponent) {}
    Paginator => object(PaginatorComponent) {}
    Security => object(SecurityComponent) {}
    Prg => object(PrgComponent) {}
}
'csrf'

このプラグインはすぐに使えるはずだと理解していますが、登録フォームとブラック ホールを処理しない明確な理由がわかりません。

4

1 に答える 1

2

セキュリティ コンポーネントは、これを CRSF 攻撃と見なしています。次のことを確認してください。

  1. フォームをリロードしていない (データを再送信している)
  2. フォームは正しく作成されています。プラグインが提供する基本的なフォームでテストすることをお勧めします。
  3. AJAXを使用していません。AJAX で動作しますが、いくつか設定する必要があると思います。
  4. ブラウザはすべてのヘッダーを適切に送信しています。おそらく、リクエストを改ざんしているデバッグ用のアドオンがあり、CRSF攻撃を作成している可能性があります

セキュリティ コンポーネントは非常に賢明なようで、通常とは異なるリクエストを攻撃の可能性として簡単にフラグ付けします。

于 2013-02-22T11:36:07.333 に答える