Подход 2011 года к XSS в PHP?
Я пытаюсь получить информацию о доступных и соответствующих контрмерах, которые активно уменьшают вероятность того, что в течение 2011 года будет отправлен поезда XSS.
Я уже давно как-то искал Google, чтобы узнать, что в Интернете доступно много доступных библиотек, которые должны помочь с проблемами XSS, которые с гордостью и смело заявляют, что "XSS/SQL injection buck останавливается здесь".
Я обнаружил, что эти библиотеки страдают, по крайней мере, одним из двух следующих симптомов:
- Библиотека настолько огромна, что она, вероятно, имеет собственное сердцебиение.
- Библиотека находится в те времена, когда пляжные мальчики играли по радио.
PHP существует уже некоторое время, и далекий от приличного strip_tags
сопровождается такими функциями, как filter_var
, среди прочих. Я далек от эксперта по этим вопросам безопасности и действительно не могу сказать, обеспечит ли он хорошие ночи сна в будущем или нет.
Каков мой лучший шанс сократить инъекции XSS в течение 2011 года без раздувания моего кода, с или без датированных библиотек?
Ответы
Ответ 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.
В обоих случаях потенциально зараженная переменная очищается непосредственно перед использованием. Вы точно знаете, как вы используете данные, поэтому ясно, как их нужно очищать.