Циклы перенаправления с 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'); 
   }; 
}; 
?>

логин.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): слишком много перенаправлений.

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


person puk    schedule 09.03.2012    source источник
comment
Пак, я сказал, что вернусь и дам тебе правильный ответ сегодня. Почему бы не поднять это на нашем обсуждении. Спрашивать, что по сути является одним и тем же Q полдюжиной разных способов, противоречит духу SO. Вы просто тратите время ответчиков.   -  person TerryE    schedule 10.03.2012
comment
@TerryE Извините, я вернулся и уточнил в нашей дискуссии   -  person puk    schedule 12.03.2012


Ответы (1)


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

Я объяснил, как это сделать, в нашем чате.

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

О: В вашем коде обнаружена логическая ошибка. Форма входа имеет действие logon.php, которое затем выполняет префикс перед обработкой сценария входа. Этот prepend.php обнаруживает, что пользователь не вошел в систему, и поэтому перенаправляет на logon.php. Итак, хром обнаруживает, что запрос на logon.php перенаправляется на logon.php и вызывает ошибку, которую вы перечисляете.

person TerryE    schedule 10.03.2012