2012-06-27 3 views
2

Я прочитал OSSAS XS prevention cheat sheet, но я действительно не признаю свое приложение с этими правилами. Я не чувствую, что у меня есть какая-либо уязвимость, указанная в этих правилах.В моем конкретном приложении PHP, что еще я могу сделать для уязвимостей XSS?

Я делаю PHP приложение, которое следует все следующие принципы:

  1. Ни один ввод данных пользователем отображается непосредственно на странице HTML без обработки и продезинфицировать на серверной стороне

  2. Все мои данные пользователя дезинфицируются с помощью htmlentities(). Этого достаточно? (Я использую подготовленные операторы для SQL-инъекции)

  3. Некоторые пользовательские данные имеют состояние maxlength, состоящее из 5 символов на стороне сервера. Защищает ли это от XSS? (так как я почти не вижу, чтобы код XSS был короче, чем 6 символов)

  4. Помимо данных из базы данных, только пользовательский ввод, отображаемый обратно пользователю, был отправлен на сервер через ajax, дезинфицированный с помощью htmlentities и повторно введенный в DOM с использованием text() вместо html() (используя JQuery)

я должен быть обеспокоен XSS в моем случае? Что еще я могу сделать, чтобы защитить себя от XSS?

+2

Ihmo отношение к тому, чтобы иметь: вы всегда должны быть обеспокоены XSS, даже в приложениях Hello World. Опираясь на базовые функции, такие как maxlength validation/filtering, чтобы предотвратить xss вместо простого использования одной из функций экранирования, кажется ленивым. http://stackoverflow.com/questions/1996122/how-to-prevent-xss-with-html-php предлагает 'htmlspecialchars()' over 'htmlentities()' –

+0

Привет, Майк, спасибо за ваш ответ. Я читаю это. – alexx0186

+1

Очки, как правило, хорошие. Однако № 3 бесполезна. Вы никогда не должны полагаться на проверку на стороне клиента для обеспечения безопасности. Свойства полей ввода не помогут вашей безопасности. Однако кажется, что у вас есть основы. Это уже делает вас впереди. –

ответ

0

Я предлагаю использовать HTMLawed или HTMLPurifier для ввода данных пользователя, который должен отображаться в виде HTML, или просто полностью зачистки всех HTML от пользовательского ввода, который не должен содержать его в любом случае. HTMLPurifier является более мощным из двух, и у меня никогда не было проблем с XSS в любых проектах, с которыми я его использовал.

1

Все введенные пользователем данные дезинфицируются с помощью htmlentities(). Этого достаточно? (Я использую подготовленные инструкции для SQL-инъекции)

No. Во-первых, вы должны фильтровать на вывод, а не на вход. В программировании никогда не доверяйте никаким данным, даже тем из вашей собственной базы данных! На входе вам просто нужно избегать его для использования в SQL, журналах и т. Д. Но вам также нужно фильтровать основные html + некоторые специальные символы: \0 & < > () + - = " ' \ на выходе. htmlentities() просто недостаточно.

Представьте у вас есть изображение на сайте:

<img src="xxx" onload="image_loaded({some_text_from_db});"> 

{some_text_from_db} будет );alert(String.fromCharCode(58,53,53)

Если вы денешься только с htmlentities станет:

< IMG SRC = "" OnLoad = "image_loaded (); alert (String.fromCharCode (58,53,53));" >

Некоторые пользовательские данные имеют условие maxlength, состоящее из 5 символов на стороне сервера. Защищает ли это от XSS?(так как я почти не вижу, чтобы код XSS был короче 6 символов)

Всегда проверяйте данные на стороне сервера, если вы хотите также на стороне клиента, это нормально, но всегда делайте это также на стороне сервера. Многие современные браузеры (хром, ff, opera) позволяют пользователю редактировать страницу «на лету», чтобы они могли легко удалить атрибут maxlength.

Помимо данных из базы данных, только пользовательский ввод, который отображается обратно пользователю было отправлено на сервер через Ajax, продезинфицировать с htmlentities и повторно в DOM, используя текст() вместо HTML() (с помощью JQuery)

с .text() документации Jquery:

Мы должны знать, что этот метод экранирует строку при условии по мере необходимости так, что он будет правильно сделать в HTML. Для этого он вызывает метод DOM .createTextNode(), который заменяет специальные символы своими эквивалентами объектов HTML (например, < для <).

Так что, вероятно, да, этого должно быть достаточно, но помните о выходе из текста(), как в примере выше.

Ваше фильтрование приложение должно выглядеть следующим образом:

  • ВХОД USER -> FILTER -> ПРИМЕНЕНИЕ
  • ВЫХОД ПРИМЕНЕНИЕ -> FILTER -> USER

Не только вход фильтрация.

Смежные вопросы