Заботясь о XSS

Я запустил приложение для проверки на проникновение, и оно обнаружило массу ошибок XSS, в частности, я виновен в том, что отправляю непроверенные данные обратно в браузер через строку запроса.

В частности, выполнение этого помещает javascript на мою страницу. http://www.mywebsite.com/search.php?q=%00 '"[ScRiPt]% 20% 0a% 0d> предупреждение (426177032569)% 3B [/ ScRiPt].

К счастью, я не могу позволить пользователям сохранять данные в базе данных и отображать их другим пользователям, поэтому я ДУМАЮ, что люди смогут взломать только себя с помощью этой проблемы, но я все еще хочу ее исправить.

Рекомендация для этого:

echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);

Но в настоящее время мне нужно исправить это как можно скорее, а затем исправлять в каждом конкретном случае. У меня есть файл заголовка, который я включаю на каждую страницу сайта, я знаю, что это плохой тон, но что могло бы взорваться, если бы я это сделал:

array_walk($_POST, 'htmlentities');  

Мне также нужно сделать это для COOKIE и GET. Я никогда не использую _REQUEST.

Спасибо

Есть ли во всем этом вопрос?

George Stocker 16.01.2009 22:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
433
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Слепое экранирование всего ввода на внешнем интерфейсе будет означать, что любая часть вашей программы, которая имеет дело с этим вводом, должна будет обрабатывать версии с экранированием html <,>, & и т. д. Если вы храните данные в базе данных, тогда вы будет иметь данные с экранированием html в вашей базе данных. Если вы используете данные в контексте, отличном от HTML (например, при отправке электронного письма), люди увидят & lt; вместо <и т. д.

Вероятно, вы просто хотите уйти при выводе.

Однако я не думаю, что это дает ответ на вопрос.

Phantom Watson 16.01.2009 22:32

ОП спросил, что может взорваться. Это пример одной из причин того, что глобальное побег может вызвать взрыв.

Noah Goodrich 16.01.2009 22:47

приведенный выше код не сработал, но это работает:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if (count($array)){
        foreach ($array as $key => $value) {
            $array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
        }
    }
    return $array;
}

Я просто пытаюсь понять, что здесь может пойти не так.

Мой первоначальный ответ заключался бы в том, чтобы предложить вам сначала убедиться, что ваша логика представления обрабатывается отдельно от вашей бизнес-логики и т. д.

Если логика представления действительно разделена, вам нужно будет оценить, как вы в настоящее время выводите на экран. Можете ли вы запускать каждый вывод с помощью одного и того же вызова функции, который избегает вывода всего вывода на экран?

Например, вызовите clean_output, когда вы перейдете к фактическому выводу на экран, но я бы не стал этого делать до манипуляций с базой данных или манипуляций бизнес-логикой с данными, потому что есть вероятность, что вы избежите того, что следовало оставить как есть.

Ответ принят как подходящий

HTML-экранирование на пути, очевидно, является неправильным, но может быть временным исправлением, пока вы не замените код чем-то подходящим. В долгосрочной перспективе это будет невозможно поддерживать, и у вас будет множество странных ошибок на уровне приложения везде, где вы начнете выполнять манипуляции с подстрокой (включая усечение, которое ваша база данных может выполнять автоматически) с помощью & -кодированных символов. Это вряд ли приведет к нарушениям безопасности, хотя вы не можете сказать, не взглянув на приложение более подробно.

Если вы каждый раз начинаете кодировать что-то в $ _SESSION, вы получите многократно закодированные слишком длинные строки, такие как & amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; ; очень быстро.

I THINK people would only be able to hack themselves

Или злоумышленник на другой веб-странице может перенаправить или iframe на вашу, с введенным достаточным количеством скриптов, чтобы отобразить поддельное поле входа, которое выглядит так же, как ваш сайт, получить имя пользователя и пароль или автоматически удалить свою учетную запись. Вроде того. Не очень хорошо.

The recommendation is to do this: echo htmlentities($_POST[‘input’], ENT _QUOTES, ‘UTF-8’);

Нет необходимости в htmlentities и всех этих параметрах - используйте htmlspecialchars.

Вы можете сэкономить несколько нажатий клавиш, используя что-то вроде:

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>

На самом деле это не так уж и много лишних хлопот.

Что ж, вам могут потребоваться некоторые дополнительные параметры при использовании htmlspecialchars для защиты от XSS с использованием другой кодировки символов - эта статья объясняет все: shiftlett.org/blog/2007/may/character-encoding-and-xss

Ian Oxley 17.06.2009 13:34

Другие вопросы по теме