PHP дезинфицирует пользовательские данные для использования в функции header()

Существуют ли какие-либо процедуры запуска, которые должны выполняться для пользовательских данных для ее использования в функции PHP header()?
Например, для MySQL я запускаю mysql_real_escape_string() над пользовательскими данными перед отправкой его в БД и для вывода в HTML. Я запускаю htmlspecialchars()... оба завернуты в мою собственную пользовательскую функцию, чтобы сначала выполнить некоторую другую обработку.

Но для функции PHP header(), что нужно сделать? Есть ли какие-либо опасные символы, которых я должен избегать?

Я пытаюсь сделать что-то вроде этого... добавление строки запроса в header() перенаправление на другую страницу

if ( strlen($_SERVER['QUERY_STRING']) > 0) {
$query_string = '?'.$_SERVER['QUERY_STRING'];
}
header('Location: http://domain.com/activate.php'.$query_string);
exit();

Кто-нибудь получил информацию о том, что нужно экранировать для функции header()? Символы Colon и semi-colon всегда кажутся довольно важными для операторов header(). Должен ли я избегать этих?

Ответы

Ответ 1

Нет, вам нечего делать, чтобы защитить себя, если вы используете PHP >= 4.4.2 (если на PHP4) и >= 5.1.2 (если PHP5).

Смотрите документы для header(). В частности:

Эта функция теперь предотвращает одновременное отправку нескольких заголовков в качестве защиты от атак заголовков.

Таким образом, нет существенной необходимости избегать чего-либо для заголовка местоположения. Если вы используете более ранние версии, вам нужно избежать всех символов \r и \n (для предотвращения вставки заголовка).

Кроме того, не urlencode строку запроса. Это сломает семантический смысл отправляемых данных. Просто добавьте его полностью.

Ответ 2

Вы также можете использовать http_build_query для преобразования связанного массива в строку запроса.

<?php
    $data = array('foo'=>'bar',
          'baz'=>'boom',
          'cow'=>'milk',
          'php'=>'hypertext processor');

    echo http_build_query($data) . "\n";
?>

Вышеприведенный пример выводит:

foo=bar&baz=boom&cow=milk&php=hypertext+processor

Ответ 3

Там могут быть некоторые эксплойты, такие как множественные отправленные заголовки, несмотря на то, что если вы используете PHP5.1, это предотвращается PHP, о котором сообщается здесь:

4.4.2 и 5.1.2: эта функция теперь предотвращает одновременное отправку нескольких заголовков в качестве защиты от атак с атакой заголовков.

Часть из этого, если вы ожидаете, что строка запроса будет прикреплена к этому файлу, и вы не используете URL-адреса SEO, вы должны проверить строку запроса с помощью urlencode(), которая будет проверять, какая строка является строкой запроса, или нет и заменит странные символы или недопустимые символы с соответствующими % и +.

Литература: