Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Выход из входа не является лучшим, можно сделать для успешного предотвращения XSS. Также вывода нужно оставить. При использовании движка шаблонов Присяжного острослова можно использовать |escape:'htmlall'
модификатор для преобразования всех чувствительных символов в объекты HTML (я использую собственный |e
модификатор, который является псевдонимом к вышеупомянутому).
Мой подход к безопасности ввода/вывода:
Трудно реализовать полное внедрение SQL/xss инжекционное предотвращение на сайте, который не вызывает ложные аварийные сигналы. В CMS конечный пользователь мог бы хотеть использовать <script>
или <object>
, который связывается с объектами от другого сайта.
я рекомендую иметь всю пользовательскую установку FireFox с NoScript;-)
Я нахожу, что лучший способ использует класс, который позволяет Вам связывать свой код, таким образом, Вы никогда не должны волноваться о ручном выходе из Ваших данных.
Пользуйтесь существующей библиотекой санитизации ввода данных пользователем для очистки весь ввод данных пользователем. Если Вы не поместите , партия из усилия в него, реализовывая его сами никогда не будет работать также.
Сделайте Вас любыми сеансовыми куки (или все cookie), Вы используете HttpOnly. Большинство браузеров скроет значение cookie от JavaScript в этом случае. Пользователь мог все еще вручную скопировать cookie, но это помогает предотвратить прямой доступ сценария. StackOverflow имел эту проблему durning бета.
Это не решение, просто другой кирпич в стене
Все эти ответы являются большими, но существенно, решение XSS будет состоять в том, чтобы прекратить генерировать документы HTML обработкой строк.
вход Фильтрации всегда является хорошей идеей для любого приложения.
Выход из Вашего вывода с помощью htmlentities () и друзья должен работать, пока это используется правильно, но это - HTML-эквивалент создания SQL-запроса путем конкатенации строк с mysql_real_escape_string ($var) - это должно работать, но меньше вещей может проверить работу, если можно так выразиться, по сравнению с подходом как использование параметризированных запросов.
долгосрочное решение должно быть для приложений, чтобы создать страницу внутренне, возможно, с помощью стандартного интерфейса как DOM, и затем пользоваться библиотекой (как libxml) для обработки сериализации к XHTML/HTML/etc. Конечно, мы - длинные пути далеко от того являющегося популярным и достаточно быстрым, но тем временем мы должны создать наши документы HTML через строковые операции, и это по сути более рискованно.
“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.
Я нахожу, что использование этой функции помогает разделить много возможных нападений xss: http://www.codebelay.com/killxss.phps
Если Вы обеспокоены нападениями на XSS, кодирование Ваших выходных строк к HTML является решением. Если Вы не забываете кодировать каждый выходной символ к формату HTML, нет никакого способа выполнить успешное нападение XSS.
Читать дальше пользовательские данные Очистки: Как и где сделать это
Выход из всего ввода данных пользователем достаточно для большинства сайтов. Также удостоверьтесь, что идентификаторы сессии не заканчиваются в URL, таким образом, они не могут быть украдены от эти Referer
ссылка на другой сайт. Кроме того, если Вы позволяете Вашим пользователям отправлять ссылки, не удостоверьтесь никакой javascript:
, ссылки протокола позволяются; они выполнили бы сценарий, как только пользователь нажимает на ссылку.
Я полагаюсь PHPTAL для этого.
В отличие от Присяжного острослова и простого PHP, это выходит из всего вывода по умолчанию. Это - большая победа для безопасности, потому что Ваш сайт не станет vurnelable, если Вы забудете htmlspecialchars()
или |escape
где-нибудь.
XSS является определенным для HTML нападением, таким образом, вывод HTML является правильным местом для предотвращения его. Вы не должны пытаться предварительно фильтровать данные в базе данных, потому что Вам могло быть нужно к выходным данным к другому носителю, который не принимает HTML, но имеет его собственные риски.
Записи rikh:
я прилагаю все усилия, чтобы всегда назвать htmlentities () для чего-либо, что я - вывод, который получен из ввода данных пользователем.
См. эссе Joel о Взгляд Кода Создания Неправильно для справки с этим
Это - большой вопрос.
Первый, не выходите из текста на входе кроме сделать его безопасным для устройства хранения данных (такой как помещаемый в базу данных). Причина этого - Вы, хотят сохранить то, что было введено так, можно контекстуально представить ее по-разному и места. Внесение изменений здесь может поставить под угрозу Ваше более позднее представление.
, Когда Вы идете для представления данных, отфильтровывают то, что не должно быть там. Например, если нет причины JavaScript, чтобы быть там поиском его и удалить его. Простой способ сделать, который должен использовать функция strip_tags и только представить теги HTML, которые Вы позволяете.
Затем, берут то, что Вы имеете и передаете его мысль htmlentities или htmlspecialchars для изменения то, что там к символам ASCII. Сделайте это на основе контекста и что Вы хотите вынуть.
я, также, предложил бы выключить Волшебные Кавычки. Это, был удален из PHP 6 и считается плохой практикой для использования его. Детали в http://us3.php.net/magic_quotes
для получения дополнительной информации выезд http://ha.ckers.org/xss.html
Это не полный ответ, но, достаточно надо надеяться, чтобы помочь Вам начать.
Существует много способов сделать XSS (См. http://ha.ckers.org/xss.html ), и очень трудно поймать.
я лично делегирую это к текущей платформе, которую я использую (Воспламенитель кода, например). В то время как не прекрасный, это могло бы поймать больше, чем моя рука, сделанная стандартными программами когда-либо сделать.
Я имею мнение, что ни из чего не нужно выходить во время входа, только на выводе. Так как (большую часть времени) Вы не можете предположить, что знаете, куда те данные идут. Пример, если у Вас есть форма, которая берет данные, которые позже появляются в электронном письме, которое Вы отсылаете, Вам нужен различный выход (иначе, злонамеренный пользователь мог переписать Ваши почтовые заголовки).
, Другими словами, можно только выйти в самый последний момент, данные "оставляют" приложение:
Для движения короткий:
особенно № 3 произойдет, если Вы выйдете из данных на входном слое (или Вам нужен к de-escape он снова, и т.д.).
пз: я буду второй совет для того, чтобы не использовать magic_quotes, те - чистое зло!
Лично, я отключил бы magic_quotes. В PHP5 + это отключено по умолчанию, и лучше кодировать, как будто это не там вообще, поскольку это не выходит из всего, и это будет удалено из PHP6.
Затем, в зависимости от то, какие пользовательские данные Вы фильтруете, продиктует, что сделать затем, например, если это - просто текст, например, имя, тогда strip_tags(trim(stripslashes()));
это или проверять на диапазоны использует регулярные выражения.
, Если Вы ожидаете определенный диапазон значений, создайте массив допустимых значений и только позвольте те значения до (in_array($userData, array(...))
).
, Если Вы проверяете, числа используют is_numeric, чтобы осуществить целые числа или бросить к определенному типу, который должен предотвратить людей, пытающихся отправить строки в земельном участке.
, Если у Вас есть PHP5.2 + тогда, рассматривают рассмотрение фильтр () и использование того расширения, которое может отфильтровать различные типы данных включая адреса электронной почты. Документация не особенно хороша, но улучшается.
, Если необходимо обработать HTML тогда, необходимо рассмотреть что-то как Входной Фильтр PHP или Очиститель HTML . Очиститель HTML также проверит HTML для соответствия. Я не уверен, разрабатывается ли Входной Фильтр все еще. Оба позволят Вам определять ряд тегов, которые могут использоваться и какие атрибуты позволяются.
Независимо от того, что Вы выбираете, всегда помните, никогда ничему не доверяйте, входя в Ваш Сценарий PHP от пользователя (включая себя!).
Библиотека шаблонов. Или, по крайней мере, это то, что должны делать библиотеки шаблонов. Чтобы предотвратить XSS , весь вывод должен быть закодирован. Это не задача основной логики приложения / управления, она должна выполняться исключительно методами вывода.
Если вы добавите htmlentities () в свой код, общий дизайн будет неправильным. И, как вы предлагаете, вы можете пропустить одно или два места. Вот почему единственным решением является строгое кодирование html -> когда выходные переменные записываются в поток html / xml.
К сожалению, большинство библиотек шаблонов php добавляют только свой собственный синтаксис шаблонов, но не заботятся о кодировке вывода, локализации, проверке html или чем-либо важном. Может быть, кто-то еще знает подходящую библиотеку шаблонов для php?
Вы должны, по крайней мере, проверить все данные, попадаемые в базу данных. И попробуйте проверить все данные, выходящие из базы данных.
mysql_real_escape_string хорошо предотвращает внедрение SQL, но XSS сложнее. Вы должны preg_match, stip_tags или htmlentities, где это возможно!