PHP очищает пользовательские данные для использования в функции header () - PullRequest
17 голосов
/ 15 апреля 2011

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 15 апреля 2011

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

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

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

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

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

1 голос
/ 15 апреля 2011

Вы также можете использовать 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
1 голос
/ 15 апреля 2011

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

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

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

Ссылки:

...