1

私はSymfony1.4とDoctrine1.2で音楽ウェブサイトを構築しています。Facebookプラグイン(メッセージボタンの送信、投稿など)を自分のページに統合しようとしています。たとえば、ユーザーが自分の曲モジュールの曲ページで曲を高く評価できるようにしたいと考えています。しかし、問題は、ランディングページを除くアプリのすべてのモジュールを保護するためにsfDoctrineGuardを使用したことです。したがって、ユーザーがログインしてFacebookの「いいね」ボタンを使用して曲のページで曲を高く評価すると、その曲のモジュールはsfGuardAuthによって保護されているため、Facebook APIはその曲と通信できず、ランディングページに転送されます。これは、ユーザーが私のランディングページを気に入ったかのように、私のアプリのすべてのいいねがFacebookアクティビティフィードに投稿されることを意味します。

FacebookドメインからのトラフィックがそのページにアクセスできるようにsfGuardに例外を組み込む方法はありますか?これに対する回避策はありますか?保護されたページのすべてのFacebookメタデータを、好きな曲をFacebookのウォールに表示できるようにしたいと思います。すべてのsfGuardセキュリティを無効にすると、正常に機能します。

私は困惑していて、この問題を抱えている人を他に見つけていないので、どんな助けでも素晴らしいでしょう。

4

1 に答える 1

4

FacebookからのリクエストがsfGuardのセキュリティをバイパスできるようにしたい場合は、大きなセキュリティホールになる可能性があります。誰かがFacebookでそのリンクをクリックすると、ログインしなくてもWebサイトにアクセスできるようになります。

ページをスクレイプするFacebookボットを微調整することで回避策を見つけることができます。スクレーパーのユーザーエージェントは次のとおり"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"です。したがって、ユーザーエージェントを調べることで、リクエストへのアクセスを簡単に許可できます。しかし、今日では誰でも簡単にユーザーエージェントを偽装することができます。

多分あなたは他の方法を見つけなければなりません。私は、誰もがアクセスでき、最小限の情報(アーティストと曲名だけを再生できないなど)を表示できる一種のライトページについてですが、誰かがログインしていない場合は、念のために言っておきます。ページを表示してみてください。ログインページではなく、このライトページにリダイレクトされます。要点はわかりますか?

次に、巨大なボタンを配置して、新しいユーザーが登録してページ全体を表示できるようにします。

とにかく、どのような場合でも、(でfilters.yml)filterを使用して実装する必要があります。フィルタは、アクションの前に実行されます。したがって、この種のチェックに最適な場所です。

フィルタに関する情報があります。

  • 公式 サイト 2リンク)
  • ここではssl要件の実装(申し訳ありませんがgooglecacheページ)
  • ここで基本的な実装

編集:

私はそのようにsthを続けます。まず、「facebook bot」というユーザーを作成し、そのIDを/apps/frontend/config/app.yml:に入力します。

all:
   facebook_bot_id: 56 // sf_guard_user_id

次に、簡単なフィルターを作成しますlib/filter/facebookBotFilter.php

<?php

class facebookBotFilter extends sfFilter
{
  public function execute ($filterChain)
  {
    $context    = $this->getContext();
    $controller = $context->getController();
    $request    = $context->getRequest();
    $user       = $context->getUser();

    // get the user agent
    $pathArray = $request->getPathInfoArray();
    $useragent = isset($pathArray['HTTP_USER_AGENT']) ? $pathArray['HTTP_USER_AGENT'] : '';

    if (preg_math('/facebookexternalhit', $useragent))
    {
      $member = Doctrine_Core::getTable('sfGuardUser')->find(sfConfig::get('app_facebook_bot_id'));
      // logged in the facebook bot
      $user->signIn($member);
    }

    // execute next filter
    $filterChain->execute();
  }
}

でフィルターを有効にすることを忘れないでくださいapps/frontend/config/filters.yml

rendering: ~

facebookBotFilter:
  class: facebookBotFilter

security:  ~
于 2012-07-18T21:16:02.007 に答える