Как мне запретить включенному PHP-скрипту изменять URL-адрес местоположения?
Вопрос
Я включаю PHP-скрипт, который изменяет URL.
// index.php
ob_start();
include "script.php";
// This script redirects using header("Location:");
$out = ob_get_clean();
// I use the $out data for calculations
echo $out;
Есть ли простой способ противостоять или отменить это нежелательное перенаправление?Как насчет:
header("Location: index.php"); // redirect back to self
Но это вызывает бесконечный цикл перенаправления...есть какие-нибудь идеи?
Или есть способ удалить вызовы header() из буфера $out, не позволяя ему когда-либо достичь клиента?
Решение
Просто для будущих ссылок.Начиная с PHP 5.3, появилась новая функция, вызываемая header_remove() заголовок удален() что помогает справляться с подобными ситуациями.
Другие советы
Вы могли бы попытаться перезаписать это поле заголовка недопустимым значением, например:
header('Location: ', true);
Но я не знаю, как клиенты реагируют на это.
На самом деле хорошего способа сделать это не существует.На ум приходят две вещи:
- Открыть script.php в виде текстового файла удалите все команды header(), а затем выполните eval() результат.
- Повторите пробел перед включением script.php а затем перехватите предупреждение, которое PHP генерирует о выдаче header() после того, как вывод уже начался.Вам нужно было бы повторить пробел перед буферизацией вывода.
Как насчет того, чтобы сначала включить файл в качестве переменной с file_get_contents()
, удаляя ненужные заголовки и затем запуская их с помощью PHP-кода (я не буду упоминать злое слово, используемое для разбора PHP-строки как PHP-кода)?
Если в вашем распоряжении нет PHP5.3 (скорее всего, у вас его нет), Ответ Гамбо не работает, и вы не хотите использовать eval, тогда единственный другой вариант, который я вижу, - это использование Стримы.Однако это еще одна, более гибкая, но сложная форма eval.Потоки, объединенные с токенизатор, и вы сможете избавиться от вызова этой функции с помощью простого:
require 'no-header://script.php';
Поскольку у вас есть полный текст в строке перед ее выводом, вы можете просто удалить нужные заголовки с помощью поиска и замены (например, используя регулярное выражение).