2010-04-30 116 views
50

你知道,如果你想重定向在PHP的用戶可以使用頭功能:爲什麼我必須在PHP中通過頭('Location ..')重定向後調用'exit'?

header('Location: http://smowhere.com'); 

這也是衆所周知的,這是一個很好的做法也把一個exit;header電話後,到阻止執行其他的PHP代碼。所以我的問題是:可以有效地執行標題位置調用之後的代碼嗎?在哪些情況下?惡意用戶能否完全忽略header('Location..')呼叫?怎麼樣?

回答

55

是否可以有效地執行標頭位置調用之後的代碼?

是的,總是。 header只是一行數據要求瀏覽器重定向。頁面的其餘部分仍將由PHP爲提供服務,客戶可以通過簡單地阻止執行header命令來查看其餘部分。

對於像wget這樣的命令行客戶端來說,通過簡單地告訴它不要遵循重定向,這很容易。底線:如果你不阻止它,即使在撥打header後,PHP也會發出全身。該機構完全可供接收方使用,而無需任何特殊的黑客技能。

+0

最好的方法來測試和看到這在行動是做頭重定向,然後注意到,如果你註釋死亡,它會到第二個,它在那裏,它只執行第一個。但是通過這個,您可以在重定向之後執行CURL或其他幾個命令。在很多情況下,這是很棒的。 實例: https://codenvy.com/factory?id=fkugtmevk9qfl24d – Ezos 2014-02-11 21:24:38

8

header()指示PHP應該發送HTTP標頭...發送HTTP標頭時。

而當你將呼叫寫入header()時,這些並不是立即發送的,而是當它發送給他們的時候(通常,當PHP需要開始發送響應的主體時 - 這可能比你晚認爲,當output_buffering是有效的)

所以,如果你只需要調用header(),存在是絕對NE保證不執行該語句後編寫的代碼 - 除非你表明它不絕,用exit/die

如果用戶願意,用戶可以忽略Location標題;但它不會改變任何事情,因爲header()調用之後的代碼可能會或可能不會被執行:此事是服務器端。

25

如果你重定向,但你不die()/exit()代碼總是執行並顯示

看看下面的例子:

admin.php的:

if (authenticationFails) 
{ 
    // redirect and don't die 
} 

// show admin stuff 

如果不確保結束位置標頭用戶將有機會獲得後執行。

1

運行header()後的PHP代碼。有時候,這是必需的,正如php.net上的example所示。爲了確保它不是,您完全結束程序流程。

1

re:header-location調用後的代碼能否被有效執行?

是的,如果你不關閉腳本。

re:在哪些情況下?

在任何情況下。

惡意用戶能否完全忽略頭('Location ..')調用?

不,它會強制用戶在這件事上沒有發言權。

+0

您的最後一點取決於瀏覽器。 – 2010-04-30 21:34:19

+0

不,它不會,@CarsonMyers,它後面的PHP代碼會一直執行。 – 2015-02-08 02:55:47

1

沒有退出通話,確切點/時間,你的腳本將終止將回落到兩個因素:

  1. 如何快速的客戶端瀏覽器反應重定向
  2. 需要多少時間執行其餘的腳本。

假設瀏覽器在看到位置標題時立即啓動重定向操作。這意味着它將關閉來自重定向的連接,因此它可以開始連接到新的位置。這通常意味着Web服務器將終止重定向腳本。然而,從服務器 - >客戶端發送頭文件需要很長時間,而TCP鏈接關閉進程需要從客戶端 - >服務器進行,​​這是腳本可以繼續運行的時間。

+0

請參閱http://stackoverflow.com/questions/14847010/will-php-script-be-executed-after-header-redirect for other answers – user1032531 2013-02-13 05:59:59

相關問題