你知道,如果你想重定向在PHP的用戶可以使用頭功能:爲什麼我必須在PHP中通過頭('Location ..')重定向後調用'exit'?
header('Location: http://smowhere.com');
這也是衆所周知的,這是一個很好的做法也把一個exit;
的header
電話後,到阻止執行其他的PHP代碼。所以我的問題是:可以有效地執行標題位置調用之後的代碼嗎?在哪些情況下?惡意用戶能否完全忽略header('Location..')
呼叫?怎麼樣?
你知道,如果你想重定向在PHP的用戶可以使用頭功能:爲什麼我必須在PHP中通過頭('Location ..')重定向後調用'exit'?
header('Location: http://smowhere.com');
這也是衆所周知的,這是一個很好的做法也把一個exit;
的header
電話後,到阻止執行其他的PHP代碼。所以我的問題是:可以有效地執行標題位置調用之後的代碼嗎?在哪些情況下?惡意用戶能否完全忽略header('Location..')
呼叫?怎麼樣?
是否可以有效地執行標頭位置調用之後的代碼?
是的,總是。 header
只是一行數據要求瀏覽器重定向。頁面的其餘部分仍將由PHP爲提供服務,客戶可以通過簡單地阻止執行header
命令來查看其餘部分。
對於像wget
這樣的命令行客戶端來說,通過簡單地告訴它不要遵循重定向,這很容易。底線:如果你不阻止它,即使在撥打header
後,PHP也會發出全身。該機構完全可供接收方使用,而無需任何特殊的黑客技能。
header()
指示PHP應該發送HTTP標頭...發送HTTP標頭時。
而當你將呼叫寫入header()時,這些並不是立即發送的,而是當它發送給他們的時候(通常,當PHP需要開始發送響應的主體時 - 這可能比你晚認爲,當output_buffering
是有效的)。
所以,如果你只需要調用header()
,存在是絕對NE保證不執行該語句後編寫的代碼 - 除非你表明它不絕,用exit
/die
。
如果用戶願意,用戶可以忽略Location
標題;但它不會改變任何事情,因爲header()
調用之後的代碼可能會或可能不會被執行:此事是服務器端。
如果你重定向,但你不die()
/exit()
代碼總是執行並顯示。
看看下面的例子:
admin.php的:
if (authenticationFails)
{
// redirect and don't die
}
// show admin stuff
如果不確保結束位置標頭每用戶將有機會獲得後執行。
運行header()後的PHP代碼。有時候,這是必需的,正如php.net上的example所示。爲了確保它不是,您完全結束程序流程。
re:header-location調用後的代碼能否被有效執行?
是的,如果你不關閉腳本。
re:在哪些情況下?
在任何情況下。
惡意用戶能否完全忽略頭('Location ..')調用?
不,它會強制用戶在這件事上沒有發言權。
您的最後一點取決於瀏覽器。 – 2010-04-30 21:34:19
不,它不會,@CarsonMyers,它後面的PHP代碼會一直執行。 – 2015-02-08 02:55:47
沒有退出通話,確切點/時間,你的腳本將終止將回落到兩個因素:
假設瀏覽器在看到位置標題時立即啓動重定向操作。這意味着它將關閉來自重定向的連接,因此它可以開始連接到新的位置。這通常意味着Web服務器將終止重定向腳本。然而,從服務器 - >客戶端發送頭文件需要很長時間,而TCP鏈接關閉進程需要從客戶端 - >服務器進行,這是腳本可以繼續運行的時間。
請參閱http://stackoverflow.com/questions/14847010/will-php-script-be-executed-after-header-redirect for other answers – user1032531 2013-02-13 05:59:59
最好的方法來測試和看到這在行動是做頭重定向,然後注意到,如果你註釋死亡,它會到第二個,它在那裏,它只執行第一個。但是通過這個,您可以在重定向之後執行CURL或其他幾個命令。在很多情況下,這是很棒的。 實例: https://codenvy.com/factory?id=fkugtmevk9qfl24d – Ezos 2014-02-11 21:24:38