2013-03-19 36 views
0

我正在一個現有的網站上尋找安全問題。可以肯定地說,在瀏覽器被重定向之後PHP腳本會中止,或者狡猾的用戶可能會強制腳本繼續。假設用戶當前登錄,「is_logged_in」返回1或0.假設此函數沒有漏洞。代碼如下:重定向後PHP腳本可以繼續嗎?

<? 
$fp = fopen("./debug.txt", "a"); 
fwrite("BEFORE LOGIN CHECK\n"); 

if(!is_logged_in()) { 
     fwrite("Not authed \n"); 
     header("Location: $url", TRUE, 302); 
} 
fwrite("Passed auth check \n"); 
/* Code to do some logged in functionality here */ 
?> 

使用普通瀏覽器登錄的用戶,我得到

BEFORE LOGIN CHECK 
Passed auth check 

在用戶未登錄我得到

BEFORE LOGIN CHECK 
Not authed 

是否有可能保持腳本打開(並忽略重定向),使用原始請求以便我得到

BEFORE LOGIN CHECK 
Not authed 
Passed auth check 

本質上進入if塊,獲取重定向頭,忽略它,並讓腳本繼續執行。

如果不是我會做更正此問題:

if(!is_logged_in()) { 
     fwrite("Not authed \n"); 
     header("Location: $url", TRUE, 302); 
     die(); 
} 

但我不知道這是連一個問題。

+0

'header()'*設置標題*,它不以任何方式包含*停止當前腳本*。 – deceze 2013-03-19 14:37:57

+0

debug.txt怎麼沒有進入「通過驗證檢查」。該腳本確實似乎正在終止。 – user2072710 2013-03-19 14:38:55

+0

因爲該命令無效? 'fwrite'需要*兩個參數* ...! – deceze 2013-03-19 14:40:00

回答

0

如果您在標頭後沒有exit;,那麼腳本應該繼續運行。

我在發送HTTP 200到客戶端之前已經使用過了,內容長度爲0.所以客戶端什麼也不做,PHP繼續執行。

0

header方法不會結束腳本執行,所以用戶會得到一個重定向頭,但腳本的其餘部分仍然會執行(這很危險)。

無論是死(或)重定向後退出您的代碼。

編輯:

用下面的代碼測試後:

$fp = fopen("debug.txt", "a"); 
fwrite($fp,"BEFORE LOGIN CHECK\n"); 

if(true) { 
     fwrite($fp,"Not authed \n"); 
     header("Location: index.php", TRUE, 302); 
} 
fwrite($fp,"Passed auth check \n"); 
fclose($fp); 

更改內的值,如果爲假此追加到DEBUG.TXT文件:

BEFORE LOGIN CHECK 
Passed auth check 

更改它真正把這個添加到debug.txt中:

BEFORE LOGIN CHECK 
Not authed 
Passed auth check 
+0

debug.txt怎麼沒有進入「通過驗證檢查」。該腳本確實似乎正在終止。 – user2072710 2013-03-19 14:39:41

+0

奇怪的是,我必須測試這種行爲,理論上你必須退出腳本,對它進行測試並回復給你 – cernunnos 2013-03-19 14:42:13

+0

測試過它並且頭不會中斷執行,而且你的fwrite需要獲取文件指針作爲第一個參數:fwrite($ fp,「lala」) – cernunnos 2013-03-19 14:46:21

2

正確,您需要在該標頭之後使用exit();die();停止執行PHP。

通過使用header()您只需設置一個HTTP標頭,這對PHP而言意味着什麼。你可以設置header('X-CHEESE', 'cheddar');,它會執行那個罰款,然後繼續進行處理。

您使用的死將告訴PHP停止執行,然後瀏覽器將接管,所以當它找到位置時:它將轉到提供的URL。