2012-03-09 53 views
0

我很好奇這是否是我的設置問題,或者如果auto_prepend_file自然會導致無限循環(如果不小心使用)。使用auto_prepend_file重定向循環(PHP)

,我有以下行我php.ini文件

auto_prepend_file = "/etc/prepend.php" 

然後我試圖訪問一個簡單的PHP文件

的index.php:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<HTML> 
    <HEAD> 
     <TITLE> 
     A Small Hello From The Tester 
     </TITLE> 
    </HEAD> 
<BODY> 
    <H1>TESTER</H1> 
    <P>This is very minimal "hello world" HTML document.</P> 
</BODY> 
</HTML> 

會議文件,我從this site或多或少地抽出。我意識到這不是最先進的安全技術,但它足夠用於測試目的。

passwords.php:

<?php 
$USERS['username1'] = 'password1'; 
$USERS['username2'] = 'password2'; 
$USERS['username3'] = 'password3'; 

/** 
** Query function to see if we are logged in. If the user is logged in, 
* the flow continues. If not, the user is redirected to a login screen. 
* @method check_logged 
**/ 
function check_logged(){ 
    global $_SESSION, $USERS; 
    if (!array_key_exists($_SESSION['logged'],$USERS)) { 
     header('Location: /etc/login.php'); 
    }; 
}; 
?> 

的login.php:

<?php 

/** 
* Initialize session 
*/ 
session_start(); 

/** 
* Include passwords.php which will check to see if we are logged in 
*/ 
include("/etc/passwords.php"); 

/** 
* I think this checks to see if the form has been submitted 
*/ 
if ($_POST["ac"]=="log") { 
    if ($USERS[$_POST["username"]] == $_POST["password"]) { 
     //username and password exist in $USERS array 
     $_SESSION["logged"]=$_POST["username"]; 
    } else { 
     echo 'Incorrect username/password. Please, try again.'; 
    }; 
}; 
if (array_key_exists($_SESSION["logged"],$USERS)) { //// check if user is logged or not 
    echo "You are logged in."; //// if user is logged show a message 
} else { //// if not logged show login form 
    echo '<form action="login.php" method="post"><input type="hidden" name="ac" value="log"> '; 
    echo 'Username: <input type="text" name="username" /><br />'; 
    echo 'Password: <input type="password" name="password" /><br />'; 
    echo '<input type="submit" value="Login" />'; 
    echo '</form>'; 
}; 
?> 

prepend.php:

<?php 

/** 
* Initialize session 
*/ 
session_start(); 

/** 
* Include passwords.php which will check to see if we are logged in 
*/ 
include('/etc/passwords.php'); 

/** 
* Check to see if we are logged in or not. If not, the 
* user is redirected to login.php page 
*/ 
check_logged(); 
?> 

現在,如果我走了在www.example.com/index.php Web瀏覽器和類型,鉻抱怨

此網頁有重定向循環在 http://www.example.com/etc/login.php的網頁生成了過多的 重定向。清除您的本網站的Cookie或允許第三方Cookie可以解決此問題。如果沒有,它可能是一個服務器 配置問題,而不是您的計算機的問題。這裏有 一些建議:稍後重新加載此網頁。瞭解有關此 問題的更多信息。錯誤310(net :: ERR_TOO_MANY_REDIRECTS):太多的 重定向。

如果您想知道,清除緩存並不能解決問題。看看代碼,任何人都可以告訴我,重定向循環會自然產生嗎?如果是這樣,我該如何解決這個問題。如果沒有,關於爲什麼會發生這種情況的任何想法?如有必要,我也可以發佈我的虛擬主機配置文件。

+0

Puk,我說我會回來並且今天給你一個正確的答案,爲什麼不在我們的討論中選擇這個,這與Q的精神有所不同,要問問什麼Q本質上是相同的六種不同的方式,你只是浪費了回答者的時間 – TerryE 2012-03-10 16:34:59

+0

@TerryE對不起,我回到我們的討論中並進行了詳細闡述 – puk 2012-03-12 09:31:00

回答

0

Puk,你不能在autoprepend腳本中執行登錄/註銷代碼。爲什麼?因爲如果我是你的用戶之一,爲了這個工作,這些腳本特別是passwords.php(或者如果你要將它存儲在數據庫中的話,它的訪問憑證)必須可以被我的UID讀取,就是你使用的是suPHP。這意味着我可以訪問另一個用戶的憑據。然後,我可以使用它來模擬該UserB的登錄,因此可以訪問他的網頁。

我解釋瞭如何在our chat上做到這一點。

順便說一句,只是爲了回答你提出的問題:「我很好奇這是否是我設置的問題,或者如果auto_prepend_file自然會導致無限循環,如果不小心使用。「

一個:你已經在你的代碼有一個邏輯缺陷的登錄表單有一個動作‘logon.php’處理登錄腳本之前,然後執行前置這prepend.php檢測到用戶沒有登錄,因此重定向到logon.php。因此,chrome檢測到logon.php請求重定向到logon.php,並引發列出的錯誤。