Циклы перенаправления с auto_prepend_file (PHP)
Мне любопытно, является ли это проблемой с моей установкой, или auto_prepend_file естественным образом приводит к бесконечным циклам, если их использовать небрежно.
У меня есть следующая строка моя 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>
Файлы сессий, которые я более или менее выдернул с этого сайта. Я понимаю, что это не самая современная непробиваемая защита, но она достаточно хороша для тестирования.
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
Хром жалуется, что
Эта веб-страница имеет цикл перенаправления. Веб-страница по адресу http://www.example.com/etc/login.php привела к слишком большому количеству перенаправлений. Очистка файлов cookie для этого сайта или разрешение сторонних файлов cookie может решить проблему. Если нет, возможно, это проблема конфигурации сервера, а не проблема с вашим компьютером. Вот несколько советов: Перезагрузите эту страницу позже. Узнайте больше об этой проблеме. Ошибка 310 (net::ERR_TOO_MANY_REDIRECTS): было слишком много перенаправлений.
Если вам интересно, очистка кеша не решит проблему. Глядя на код, кто-нибудь может сказать мне, если цикл перенаправления естественно возникнет из-за этого? Если так, как я могу исправить это. Если нет, то есть идеи, почему это может происходить? При необходимости я также могу опубликовать свой файл конфигурации виртуального хоста.
1 ответ
Пук, ты не можешь сделать код входа / выхода изнутри скрипта автозапуска. Зачем? Потому что, если бы я был одним из ваших пользователей, чтобы это работало, эти сценарии, особенно passwords.php (или учетные данные для доступа, если вы должны были сохранить его в базе данных), должны быть доступны для чтения по моему UID, если вы используете suPHP. Это означает, что я мог получить доступ к учетным данным другого пользователя. Затем я мог бы использовать это для имитации входа в систему для этого пользователя B и, следовательно, для доступа к его веб-страницам.
Я объяснил, как это сделать в нашем чате.
Кстати, просто чтобы ответить на вопрос, который вы задали: "Мне любопытно, является ли это проблемой с моей настройкой, или если auto_prepend_file естественным образом приводит к бесконечным циклам, если их использовать небрежно".
A: У вас есть логический недостаток в вашем коде. Форма входа в систему имеет действие "logon.php", которое затем выполняет предварительную подготовку перед обработкой сценария входа. Этот prepend.php обнаруживает, что пользователь не вошел в систему и, следовательно, перенаправляет на logon.php. Таким образом, chrome обнаруживает, что запрос logon.php перенаправляет на logon.php и вызывает ошибку, которую вы перечислите.