那麼,如果你想讓Facebook的請求能夠通過你的sfGuard安全性,它可能是一個巨大的安全漏洞。如果有人在Facebook上點擊該鏈接,它也將訪問您的網站,而無需登錄。
您可能會發現一個通過調整Facebook bot來刮擦您的頁面的工作。刮刀的用戶代理是:"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
。因此,通過查看用戶代理可以輕鬆地訪問其請求。 但是,今天任何人都可以輕易欺騙用戶代理。
也許你必須找到另一種方式。我雖然關於一種輕量級的頁面,每個人都可以訪問,並且在其中顯示最低限度的信息(比如只有藝術家和歌曲名稱,但不能播放它),但要確保如果某人未登錄嘗試查看頁面,它不會被重定向到登錄頁面,而是重定向到這個輕量頁面。您可以獲得該點嗎?
然後,您可以放一個巨大的按鈕,以允許新人註冊以查看整頁。
無論如何,在任何情況下,你會發現,你應該使用過濾器(在filters.yml
)實現它。過濾器的任何行動之前被執行。因此,它是對這種檢查的理想場所。
你會˚F有關過濾器IND信息:
編輯:
我會繼續這樣下去。首先,創建一個名爲「Facebook的殭屍」用戶,並把它的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-18 21:16:02
j0k
非常感謝@ j0k的全面回覆。欣賞它。你給了我一些很好的選擇來考慮。如果有人獲得閱讀安全頁面的權限,那麼這對我的應用程序來說並不算什麼。該登錄更多用於定製/用戶特定操作。我想嘗試允許訪問Facebook bot刮板。我如何配置sfDoctrineGuard以允許訪問機器人?我在哪裏可以這樣寫: 'if($ _SERVER ['HTTP_USER_AGENT'] ==「facebookexternalhit/1.1(+ http://www.facebook.com/externalhit_uatext.php)」){<允許訪問> 謝謝! – frankp221 2012-07-19 17:42:58
我已更新我的答案。 – j0k 2012-07-24 08:49:55
哇,我試過了,它的作用就像一個魅力!非常感謝玩玩j0k。 注意:在下面一行修正了一些小的錯別字:'(preg_match('/ facebookexternalhit',$ useragent))' – frankp221 2012-07-26 06:19:19