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()
, которая будет проверять, какая строка является строкой запроса, или нет и заменит странные символы или недопустимые символы с соответствующими %
и +
.
Литература: