2012-03-09 2 views
0

Мне любопытно, является ли это проблемой с моей настройкой, или если auto_prepend_file естественным образом приводит к бесконечным циклам, если используется небрежно.Redirect Loops with 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> 

Сеанс файлы I более или менее дергается от 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, Chrome жалуется, что

На этой странице имеется бесконечная переадресация Веб-страница http://www.example.com/etc/login.php привела слишком много переадресаций. Очистка файлов cookie для этого сайта или использование файлов cookie сторонних производителей может устранить эту проблему. Если нет, возможно, это проблема с сервером , а не проблема с вашим компьютером. Вот некоторые предложения: Перезагрузить эту страницу позже. Подробнее об этой проблеме . Ошибка 310 (net :: ERR_TOO_MANY_REDIRECTS): было переназначено слишком много .

В случае, если вам интересно, очистка кеша не устраняет проблему. Глядя на код, может ли кто-нибудь сказать мне, будет ли естественно возникать цикл переадресации? Если да, то как я могу это исправить. Если нет, какие-либо идеи относительно того, почему это может произойти? При необходимости я могу отправить файл конфигурации виртуального хоста.

+0

Puk, я сказал, что вернусь и дайте вам правильный ответ сегодня. Почему бы не подобрать это для нашего обсуждения. Это похоже на дух SO, чтобы спросить, что является по существу тем же самым Q полдюжины разных способов. Вы просто теряете время откликов. – TerryE

+0

@TerryE Извините , Я вернулся и уточнил в нашей дискуссии – puk

ответ

0

Puk, вы не можете сделать код входа/выхода изнутри сценария autoprepend. Зачем? Потому что, если бы я был одним из ваших пользователей, для этого, чтобы эти работы, эти скрипты, особенно passwords.php (или учетные данные доступа, если вы должны были хранить его в базе данных), должны быть доступны для чтения моим UID, вы используете suPHP. Это означает, что я могу получить доступ к учетным данным другого пользователя. Затем я мог бы использовать это, чтобы имитировать вход в систему для этого UserB и, следовательно, получить доступ к его веб-страницам.

Я объяснил, как это сделать на our chat.

BTW, просто чтобы ответить на вопрос Q, который вы задали: «Мне любопытно, является ли это проблемой с моей настройкой, или если auto_prepend_file естественным образом приводит к бесконечным циклам, если используется небрежно.. "

:. У вас есть логический изъян в вашем коде Форма входа имеет действие„logon.php“, который затем выполняет PREPEND перед обработкой сценария входа в систему Эта prepend.php обнаруживает, что пользователь не регистрируется и, следовательно, перенаправляется на logon.php. Поэтому chrome обнаруживает, что запрос на logon.php перенаправляет на logon.php и вызывает ошибку, которую вы перечисляете.