Подтвердить что ты не робот

Подход 2011 года к XSS в PHP?

Я пытаюсь получить информацию о доступных и соответствующих контрмерах, которые активно уменьшают вероятность того, что в течение 2011 года будет отправлен поезда XSS.

Я уже давно как-то искал Google, чтобы узнать, что в Интернете доступно много доступных библиотек, которые должны помочь с проблемами XSS, которые с гордостью и смело заявляют, что "XSS/SQL injection buck останавливается здесь".

Я обнаружил, что эти библиотеки страдают, по крайней мере, одним из двух следующих симптомов:

  • Библиотека настолько огромна, что она, вероятно, имеет собственное сердцебиение.
  • Библиотека находится в те времена, когда пляжные мальчики играли по радио.

PHP существует уже некоторое время, и далекий от приличного strip_tags сопровождается такими функциями, как filter_var, среди прочих. Я далек от эксперта по этим вопросам безопасности и действительно не могу сказать, обеспечит ли он хорошие ночи сна в будущем или нет.

Каков мой лучший шанс сократить инъекции XSS в течение 2011 года без раздувания моего кода, с или без датированных библиотек?

4b9b3361

Ответ 1

Лучшее решение - использовать механизм шаблонов, который не позволит выводить какие-либо данные в виде простого HTML, если вы явно не указали это. Если вам нужно избегать вещей вручную, то слишком легко забыть что-то и оставить себя открытым для атаки XSS.

Если вы застряли без реального шаблона, используйте htmlspecialchars().

Ответ 2

Я не мог больше согласиться с Матти Вирккуненом или с тем, что, по моему мнению, подразумевает ответ Матти, поэтому позвольте мне сказать это громко и ясно: ничего "удалит весь вредоносный код". Вы никогда не узнаете, как данные будут использоваться в других частях приложения или в будущем. Вы можете "очистить" его для SQL, но в первую очередь вы не должны ставить что-либо неэкранированное в SQL. Вы можете "очистить" его для HTML, но никогда не должны включать данные, не привязанные к HTML. Вы можете "очистить" его для включения в параметр awk в оболочке script, но... вы получите эту идею.

Даже проблема с остановкой неразрешима, а тем более вредоносные намерения любого заданного кода или данных. Любые методы ввода "очистки" бесполезны в долгосрочной перспективе. Требуется правильное экранирование данных. Всегда. Поэтому, если вы хотите включить что-либо в SQL-запрос, включите его как данные, а не как код. Если вы хотите напечатать имя пользователя в блоге, включите его как текст, а не как HTML. Никто никогда не пострадает, увидев комментарий от "Mr <script> alert (" XSS "); </script> " если имя пользователя закодировано в HTML или динамически добавлено в DOM в виде текста node.

Все инструменты автоматической очистки - это не что иное, как волшебная пыль для добавления в вашу программу, чтобы обеспечить ее безопасность. Они говорят: "Здесь - мы сделали все ваши данные кошерными, чтобы вы теперь могли использовать его ненадежно и не беспокоиться о границах данных!" Это только приводит к ложному чувству безопасности. Мы, разработчики, должны взять на себя ответственность за вывод наших данных и никогда не предполагать, что все отлично, потому что у нас есть инструмент, чтобы сделать все наши данные "безопасными", что бы это ни значило на входе.

Ответ 3

Я рекомендую HTMLPurifier для данных пользователя:

HTML-очиститель - это стандартно-совместимый Библиотека HTML-фильтра, написанная на PHP. Очиститель HTML не только удалит все вредоносный код (более известный как XSS) с тщательно проверенной, надежной разрешающий белый список, он также убедитесь, что ваши документы являются стандартами совместимый, что-то только достижимое с полным W3C.

Ответ 4

Правило 3b основные правила безопасности - это почти все, что нужно. Принудительно конвертируйте пользовательский ввод, прежде чем вы выводите его, и вы в безопасности.

Ответ 5

Реальные изменения 2011 года в браузерах. Например, IE первым применил xss-фильтр.

Чтобы быть честным, как SQL Injection, так и XSS можно позаботиться о наличии безопасного MVC. Например, если данные передаются в представление, его необходимо очистить для просмотра. В php smarty это можно сделать, настроив "Variable Filter". Для внедрения sql вы должны использовать параметризованные запросы ADODB или PDO.

В обоих случаях потенциально зараженная переменная очищается непосредственно перед использованием. Вы точно знаете, как вы используете данные, поэтому ясно, как их нужно очищать.