В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Вы не хотите кодировать весь HTML, Вы только хотите к HTML - кодируют любой ввод данных пользователем, который Вы производите.
Для PHP: htmlentities и htmlspecialchars
Одна вещь, которую Вы не должны делать, отфильтровать входные данные, как это входит. Люди часто предлагают это, так как это - самое легкое решение, но это приводит к проблемам.
Входные данные могут быть отправлены в несколько мест помимо того, чтобы быть произведенным как HTML. Это могло бы быть сохранено в базе данных, например. Правила для фильтрации данных, отправленных в базу данных, очень отличаются от правил для фильтрации вывода HTML. Если Вы, HTML - кодирует все на входе, Вы закончите с HTML в своей базе данных. (Это также, почему "волшебные кавычки PHP" функция являются плохой идеей.)
Вы не можете ожидать все места, Ваши входные данные переместятся. Безопасный подход должен подготовить данные непосредственно перед тем, как это отправляется куда-нибудь. Если Вы отправляете его в базу данных, выходите из одинарных кавычек. Если Вы производите HTML, выходите из объектов HTML. И после того как это отправляется куда-нибудь, если все еще необходимо работать с данными, используйте исходную незавершенную версию.
Это - больше работы, но можно уменьшить ее при помощи движков шаблонов или библиотек.
Хорошим путем я раньше выходил из всего ввода данных пользователем, путем записи модификатора для присяжного острослова, который выходит из всех переменных, переданных шаблону; за исключением тех, которые имеют |unescape, присоединенный к нему. Тем путем Вы только предоставляете доступ HTML к элементам, к которым Вы явно предоставляете доступ.
У меня больше нет того модификатора; но о той же версии может быть найден здесь:
http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html
В новом выпуске Django 1.0 это работает точно тот же путь, сойка :)
Для JSPs Вы можете иметь свой пирог и съесть его также с тегом c:out, который выходит из XML по умолчанию. Это означает, что можно связать со свойствами как необработанные элементы:
<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" />
При привязке со строкой someName.someProperty будет содержать вход XML, но будучи произведенным к странице, этого автоматически оставят для обеспечения объектов XML. Это особенно полезно для ссылок для проверки страницы.
Мое персональное предпочтение состоит в том, чтобы старательно закодировать что-либо, что это прибывает из базы данных, бизнес-слоя или от пользователя.
В ASP.NET это сделано при помощи Server.HtmlEncode(string)
.
Причина так кодирует что-либо, то, что даже свойства, которые Вы могли бы принять, чтобы быть булевской переменной или числовой, могли содержать вредоносный код (Например, значения флажка, если они сделаны неправильно, могли бы возвращаться как строки. Если Вы не кодируете их прежде, чем отправить вывод пользователю, то у Вас есть уязвимость).
Если Вы делаете на самом деле, HTML кодирует каждый вывод, пользователь будет видеть простой текст < html> вместо функционирующего веб-приложения.
Править: Если Вы, HTML кодирует каждый вход, у Вас будет проблема при принятии внешнего пароля, содержащего <и т.д.
Вы могли перенести эхо / печать и т.д. в Ваших собственных методах, которые можно затем использовать для выхода из вывода. т.е. вместо
echo "blah";
использовать
myecho('blah');
у Вас мог даже быть второй параметрический усилитель, который выключает выход, если Вам нужен он.
В одном проекте у нас был режим отладки в наших функциях вывода, которые сделали весь синтезируемый текст, проходящий наш метод невидимый. Затем мы знали, что что-нибудь на экране HAD, не, вышло! Было очень полезное отслеживание вниз теми непослушными незавершенными битами :)
Единственный способ действительно защитить себя от этого вида нападения состоит в том, чтобы строго отфильтровать весь вход, который Вы принимаете, конкретно (хотя не исключительно) от общественных областей Вашего применения. Я рекомендовал бы смотреть на PHP Daniel Morris Фильтрация Класса (полное решение) и также пакет Zend_Filter (набор классов, которые можно использовать для создания собственного фильтра).
PHP является моим предпочтительным языком когда дело доходит до веб-разработки, таким образом, извинения за предвзятость в моем ответе.
Kieran.
было хорошее эссе от Joel на программном обеспечении (заставляющий неверный код выглядеть неправильным, что я думаю, я говорю по телефону иначе, у меня был бы URL для Вас), который покрыл корректное использование Венгерской записи. Короткая версия была бы чем-то как:
Var dsFirstName, uhsFirstName : String;
Begin
uhsFirstName := request.queryfields.value['firstname'];
dsFirstName := dsHtmlToDB(uhsFirstName);
В основном снабдите префиксом свои переменные что-то как "мы" для небезопасной строки, "ds" для безопасной базы данных, "hs" для безопасного HTML. Вы только хотите закодировать и декодировать, где Вам на самом деле нужен он, не все. Но при помощи их префиксы, которые выводят полезное значение, смотрящее на Ваш код, который Вы будете видеть реальный быстрый, если что-то не будет правильно. И Вы испытываете необходимость отличающийся, кодируют/декодируют функции так или иначе.