настройки расширения php фильтра по умолчанию - PullRequest
0 голосов
/ 27 января 2011

xss.php

<?php
header('Content-Type:text/html; charset=UTF-8');

var_dump(ini_get('filter.default'));

if (isset($_GET['name'])) {
    echo $_GET['name'];
    exit();
}

просмотр http://localhost/xss.php?name=%3Cscript%3Ealert('XSS')%3C/script%3E

вывод:

строка (10) "unsafe_raw "

У меня сложилось впечатление, что это безопасно для уязвимостей XSS из-за расширения фильтра, но это не так!Он выводит диалоговое окно предупреждения JavaScript.Мои вопросы:

  • Почему фильтр по умолчанию unsafe_raw.Я читал, что unsafe_raw не защищает от XSS?
  • Как я могу защитить PHP от этой уязвимости.Я мог бы изменить php.ini, но я хотел бы сделать это во время выполнения, но ini_set, .htaccess по умолчанию не работают на моем Ubuntu box.Я хочу, чтобы это влияло на время выполнения, чтобы все экземпляры php (при развертывании на других машинах) были в безопасности.Это возможно, или мне действительно нужно посыпать мой код filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);, чтобы сделать его безопасным.

PS: Этот код безопасен и также выглядит не так уж плохо,но если бы я мог настроить его во время выполнения, это было бы лучше.

<?php
header('Content-Type:text/html; charset=UTF-8');

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
if (isset($_GET['name'])) {
    echo $_GET['name'];
    exit();
}

1 Ответ

2 голосов
/ 27 января 2011

Расширение фильтра не защищает от входных строк XSS. Большинство функций фильтра выполняют некоторую ограниченную очистку на основе наборов символов. Некоторые, такие как _VALIDATE_EMAIL и _VALIDATE_URL, просто проверяют формат в соответствии с регулярными выражениями (в основном).

Даже w3fools говорит:

Фильтр FILTER_UNSAFE_RAW ничего не делает или кодирует и удаляет указанные символы.

Вам нужно использовать его в сочетании с параметром _FLAG_STRIP_ * или _FLAG_ENCODE_ *, чтобы сделать его полезным.

А что касается FILTER_SANITIZE_SPECIAL_CHARS, то вам лучше всего использовать htmlspecialchars ().

Почему фильтр по умолчанию unsafe_raw.

Чтобы не испортить поведение существующих скриптов, настройки фильтра по умолчанию ничего не делают.

Как я могу защитить PHP от этой уязвимости. Я мог бы изменить свой php.ini, но я хотел бы сделать это во время выполнения, но ini_set, ...

Напишите короткую функцию-обертку для htmlspecialchars () и примените ее к всем выводам, которые вы делаете, независимо от того, откуда поступил ввод.

Установка функции фильтра по умолчанию с помощью ini_set () невозможна AFAIK, потому что фильтр работает в основном как magic_quotes. Он просто вызывается один раз для всех входных данных при запуске PHP. Вызов ini_set не влияет на существующие входные массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...