Что является лучшими практиками для предотвращения xss нападения в сайте PHP

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
65
задан Rik Heywood 3 May 2011 в 10:22
поделиться

19 ответов

Выход из входа не является лучшим, можно сделать для успешного предотвращения XSS. Также вывода нужно оставить. При использовании движка шаблонов Присяжного острослова можно использовать |escape:'htmlall' модификатор для преобразования всех чувствительных символов в объекты HTML (я использую собственный |e модификатор, который является псевдонимом к вышеупомянутому).

Мой подход к безопасности ввода/вывода:

  • ввод данных пользователем хранилища, не измененный (никакой выход HTML на входе, только осведомленный о DB выход, сделанный через PDO, подготовил операторы)
  • Escape на выводе, в зависимости от того, какой выходной формат Вы используете (например, HTML и JSON нуждаются в различных правилах выхода)
58
ответ дан Michał Rudnicki 24 November 2019 в 15:23
поделиться

Трудно реализовать полное внедрение SQL/xss инжекционное предотвращение на сайте, который не вызывает ложные аварийные сигналы. В CMS конечный пользователь мог бы хотеть использовать <script> или <object>, который связывается с объектами от другого сайта.

я рекомендую иметь всю пользовательскую установку FireFox с NoScript;-)

-1
ответ дан Mr Lister 24 November 2019 в 15:23
поделиться

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

0
ответ дан Darren22 24 November 2019 в 15:23
поделиться

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

0
ответ дан dbr 24 November 2019 в 15:23
поделиться
  • не доверяют вводу данных пользователем
  • Escape, который весь произвольный текст произвел
  • , не используют magic_quotes; посмотрите, существует ли вариант DBMS-specfic, или используйте PDO
  • , Рассматривают использование cookie только для HTTP, если это возможно, для предотвращения любой злонамеренной способности сценария угнать сессию
1
ответ дан Rob 24 November 2019 в 15:23
поделиться

Сделайте Вас любыми сеансовыми куки (или все cookie), Вы используете HttpOnly. Большинство браузеров скроет значение cookie от JavaScript в этом случае. Пользователь мог все еще вручную скопировать cookie, но это помогает предотвратить прямой доступ сценария. StackOverflow имел эту проблему durning бета.

Это не решение, просто другой кирпич в стене

1
ответ дан basszero 24 November 2019 в 15:23
поделиться

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

вход Фильтрации всегда является хорошей идеей для любого приложения.

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

долгосрочное решение должно быть для приложений, чтобы создать страницу внутренне, возможно, с помощью стандартного интерфейса как DOM, и затем пользоваться библиотекой (как libxml) для обработки сериализации к XHTML/HTML/etc. Конечно, мы - длинные пути далеко от того являющегося популярным и достаточно быстрым, но тем временем мы должны создать наши документы HTML через строковые операции, и это по сути более рискованно.

2
ответ дан Daniel Papasian 24 November 2019 в 15:23
поделиться

“Magic quotes” является смягчающим средством от некоторых худших дефектов XSS, которые работают путем выхода из всего на входе, что-то, что это неправильно дизайном. Единственный случай, где можно было бы хотеть использовать его, - когда абсолютно необходимо использовать существующее приложение PHP, которое, как известно, было записано небрежно относительно XSS. (В этом случае Вы находитесь в серьезной проблеме даже с “magic quotes”.) При разработке собственного приложения необходимо отключить “magic quotes” и применить XSS-безопасные методы вместо этого.

XSS, уязвимость сценариев перекрестного сайта, происходит, когда приложение включает строки из внешних источников (ввод данных пользователем, выбранный от других веб-сайтов, и т.д.) в [X] HTML, CSS, ECMAscript или другой проанализированный браузером вывод без надлежащего выхода, надеясь, что специальные символы как меньше (в [X] HTML), одинарные или двойные кавычки (ECMAscript) никогда не будут появляться. Надлежащее решение его состоит в том, чтобы всегда выходить из строк согласно правилам выходного языка: с помощью объектов в [X] HTML, обратные косые черты в ECMAscript и т.д.

, поскольку может быть трудно отслеживать то, что недоверяемо и должно быть оставлено, это - хорошая идея всегда выйти из всего, что является “text string” в противоположность “text с markup” на языке как HTML. Некоторые среды программирования облегчают путем представления нескольких несовместимых строковых типов: “string” (обычный текст), “HTML string” (разметка HTML) и так далее. Тем путем прямое неявное преобразование от “string” до “HTML string” было бы невозможно, и единственный способ, которым строка могла стать разметкой HTML, путем передачи его через функцию выхода.

“Register globals”, хотя отключая его является определенно хорошей идеей, соглашениями с проблемой, совершенно отличающейся от XSS.

2
ответ дан Alexey Feldgendler 24 November 2019 в 15:23
поделиться

Я нахожу, что использование этой функции помогает разделить много возможных нападений xss: http://www.codebelay.com/killxss.phps

2
ответ дан barce 24 November 2019 в 15:23
поделиться

Если Вы обеспокоены нападениями на XSS, кодирование Ваших выходных строк к HTML является решением. Если Вы не забываете кодировать каждый выходной символ к формату HTML, нет никакого способа выполнить успешное нападение XSS.

Читать дальше пользовательские данные Очистки: Как и где сделать это

2
ответ дан Niyaz 24 November 2019 в 15:23
поделиться

Выход из всего ввода данных пользователем достаточно для большинства сайтов. Также удостоверьтесь, что идентификаторы сессии не заканчиваются в URL, таким образом, они не могут быть украдены от эти Referer ссылка на другой сайт. Кроме того, если Вы позволяете Вашим пользователям отправлять ссылки, не удостоверьтесь никакой javascript:, ссылки протокола позволяются; они выполнили бы сценарий, как только пользователь нажимает на ссылку.

2
ответ дан Konrad Rudolph 24 November 2019 в 15:23
поделиться

Я полагаюсь PHPTAL для этого.

В отличие от Присяжного острослова и простого PHP, это выходит из всего вывода по умолчанию. Это - большая победа для безопасности, потому что Ваш сайт не станет vurnelable, если Вы забудете htmlspecialchars() или |escape где-нибудь.

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

4
ответ дан Kornel 24 November 2019 в 15:23
поделиться

Записи rikh:

я прилагаю все усилия, чтобы всегда назвать htmlentities () для чего-либо, что я - вывод, который получен из ввода данных пользователем.

См. эссе Joel о Взгляд Кода Создания Неправильно для справки с этим

7
ответ дан Mason 24 November 2019 в 15:23
поделиться

Это - большой вопрос.

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

, Когда Вы идете для представления данных, отфильтровывают то, что не должно быть там. Например, если нет причины JavaScript, чтобы быть там поиском его и удалить его. Простой способ сделать, который должен использовать функция strip_tags и только представить теги HTML, которые Вы позволяете.

Затем, берут то, что Вы имеете и передаете его мысль htmlentities или htmlspecialchars для изменения то, что там к символам ASCII. Сделайте это на основе контекста и что Вы хотите вынуть.

я, также, предложил бы выключить Волшебные Кавычки. Это, был удален из PHP 6 и считается плохой практикой для использования его. Детали в http://us3.php.net/magic_quotes

для получения дополнительной информации выезд http://ha.ckers.org/xss.html

Это не полный ответ, но, достаточно надо надеяться, чтобы помочь Вам начать.

10
ответ дан Matt Farina 24 November 2019 в 15:23
поделиться

Существует много способов сделать XSS (См. http://ha.ckers.org/xss.html ), и очень трудно поймать.

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

12
ответ дан Christian Studer 24 November 2019 в 15:23
поделиться

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

, Другими словами, можно только выйти в самый последний момент, данные "оставляют" приложение:

  • элемент списка
  • Запись к XML-файлу, Escape для Записи XML
  • к DB, Escape (для того конкретного DBMS)
  • Пишет электронное письмо, Escape для электронных писем
  • и т.д.

Для движения короткий:

  1. Вы не знаете, куда Ваши данные идут
  2. , Данные могли бы на самом деле оказаться больше чем в одном месте, нуждаясь в различном механизме выхода, НО НЕ ОБА
  3. , Данные, которых оставляют для неправильной цели, действительно не хороши. (Например, доберитесь, электронное письмо с предметом "Переходят к панели \Tommy".)

особенно № 3 произойдет, если Вы выйдете из данных на входном слое (или Вам нужен к de-escape он снова, и т.д.).

пз: я буду второй совет для того, чтобы не использовать magic_quotes, те - чистое зло!

18
ответ дан Jilles 24 November 2019 в 15:23
поделиться

Лично, я отключил бы magic_quotes. В PHP5 + это отключено по умолчанию, и лучше кодировать, как будто это не там вообще, поскольку это не выходит из всего, и это будет удалено из PHP6.

Затем, в зависимости от то, какие пользовательские данные Вы фильтруете, продиктует, что сделать затем, например, если это - просто текст, например, имя, тогда strip_tags(trim(stripslashes())); это или проверять на диапазоны использует регулярные выражения.

, Если Вы ожидаете определенный диапазон значений, создайте массив допустимых значений и только позвольте те значения до (in_array($userData, array(...))).

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

, Если у Вас есть PHP5.2 + тогда, рассматривают рассмотрение фильтр () и использование того расширения, которое может отфильтровать различные типы данных включая адреса электронной почты. Документация не особенно хороша, но улучшается.

, Если необходимо обработать HTML тогда, необходимо рассмотреть что-то как Входной Фильтр PHP или Очиститель HTML . Очиститель HTML также проверит HTML для соответствия. Я не уверен, разрабатывается ли Входной Фильтр все еще. Оба позволят Вам определять ряд тегов, которые могут использоваться и какие атрибуты позволяются.

Независимо от того, что Вы выбираете, всегда помните, никогда ничему не доверяйте, входя в Ваш Сценарий PHP от пользователя (включая себя!).

2
ответ дан 24 November 2019 в 15:23
поделиться

Библиотека шаблонов. Или, по крайней мере, это то, что должны делать библиотеки шаблонов. Чтобы предотвратить XSS , весь вывод должен быть закодирован. Это не задача основной логики приложения / управления, она должна выполняться исключительно методами вывода.

Если вы добавите htmlentities () в свой код, общий дизайн будет неправильным. И, как вы предлагаете, вы можете пропустить одно или два места. Вот почему единственным решением является строгое кодирование html -> когда выходные переменные записываются в поток html / xml.

К сожалению, большинство библиотек шаблонов php добавляют только свой собственный синтаксис шаблонов, но не заботятся о кодировке вывода, локализации, проверке html или чем-либо важном. Может быть, кто-то еще знает подходящую библиотеку шаблонов для php?

4
ответ дан 24 November 2019 в 15:23
поделиться

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

mysql_real_escape_string хорошо предотвращает внедрение SQL, но XSS сложнее. Вы должны preg_match, stip_tags или htmlentities, где это возможно!

1
ответ дан 24 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: