1

セキュリティコンポーネントをオンにしたい。

しかし、Facebookタブ内にCakePHPアプリをロードすると、FBは$ _REQUEST ['signed_request']を私のフォームに投稿します-これに関する問題は、セキュリティコンポーネントがこの「投稿」に「反応」し、検証エラーを返すことです。穴など

どうすればこれを回避できますか?

この問題を回避するためのドキュメントには何も見つかりませんでした。

私が望んでいたのは、セキュリティコンポーネントを「手動で」実行して、Facebookが$ _REQUEST ['signed_request']をフォームに投稿したときではなく、実際にフォームを送信したときにのみ「反応」するようにすることでした。

アップデート:

<?php
App::uses('CakeEmail', 'Network/Email');

class PagesController extends AppController {
    public $helpers = array('Html','Form');
    public $components = array('RequestHandler');

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');

         $this->Security->validatePost = true;
         $this->Security->csrfCheck = true;
         $this->Security->unlockedFields[] = 'signed_request';
    }

    public function home() {
        $this->loadModel('Memberx');
                if($this->request->is('post') && isset($this->request->data['Memberx']['name'])) {
                 //...save here, etc. ...
                }
    }

参考:「ブラックホール」エラーが発生します。

最終更新(@tigrangの回答後):

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('*');

    $this->set('hasLiked', false);

    if(isset($this->request->data['signed_request'])){
        $this->set('hasLiked', $this->hasLiked($this->request->data['signed_request']));
    } 

    if(isset($this->request->data['Memberx']['signed_request'])) {
        $this->set('hasLiked', $this->hasLiked($this->request->data['Memberx']['signed_request']));  
    }

    /* 
    To go around Facebook's post $_REQUEST['signed_request'],
    we unset the $_REQUEST['signed_request'] and disable the csrfCheck
    ONLY after we have set the hasLiked view variable
    */
    unset($this->request->data['signed_request']);
    if (empty($this->request->data)) {
       $this->Security->csrfCheck = false;
    }        
}

次に、私の見解では以下のようなことをします。

<?php
if($hasLiked) {
?>
    You have liked this page!
<?php
}
?>
4

1 に答える 1

2
public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('*');
    $this->_validateFbRequest();
}

protected function _valdiateFbRequest() {
   if (!isset($this->request->data['signed_request'])) {
       // not a valid request from fb
       // throw exception or handle however you want
       return;
   }
   $signedRequest = $this->request->data['signed_request'];
   unset($this->request->data['signed_request']);
   if (empty($this->request->data)) {
       $this->Security->csrfCheck = false;
   }
   // validate the request
}
于 2012-08-05T23:23:47.453 に答える