Как делают меня, HTML Кодирует весь вывод в веб-приложении?

В 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 освободит память, используемую этим объектом, и выделит другую.

6
задан Niyaz 12 September 2008 в 11:05
поделиться

9 ответов

Вы не хотите кодировать весь HTML, Вы только хотите к HTML - кодируют любой ввод данных пользователем, который Вы производите.

Для PHP: htmlentities и htmlspecialchars

4
ответ дан 8 December 2019 в 12:24
поделиться

Одна вещь, которую Вы не должны делать, отфильтровать входные данные, как это входит. Люди часто предлагают это, так как это - самое легкое решение, но это приводит к проблемам.

Входные данные могут быть отправлены в несколько мест помимо того, чтобы быть произведенным как HTML. Это могло бы быть сохранено в базе данных, например. Правила для фильтрации данных, отправленных в базу данных, очень отличаются от правил для фильтрации вывода HTML. Если Вы, HTML - кодирует все на входе, Вы закончите с HTML в своей базе данных. (Это также, почему "волшебные кавычки PHP" функция являются плохой идеей.)

Вы не можете ожидать все места, Ваши входные данные переместятся. Безопасный подход должен подготовить данные непосредственно перед тем, как это отправляется куда-нибудь. Если Вы отправляете его в базу данных, выходите из одинарных кавычек. Если Вы производите HTML, выходите из объектов HTML. И после того как это отправляется куда-нибудь, если все еще необходимо работать с данными, используйте исходную незавершенную версию.

Это - больше работы, но можно уменьшить ее при помощи движков шаблонов или библиотек.

9
ответ дан 8 December 2019 в 12:24
поделиться

Хорошим путем я раньше выходил из всего ввода данных пользователем, путем записи модификатора для присяжного острослова, который выходит из всех переменных, переданных шаблону; за исключением тех, которые имеют |unescape, присоединенный к нему. Тем путем Вы только предоставляете доступ HTML к элементам, к которым Вы явно предоставляете доступ.

У меня больше нет того модификатора; но о той же версии может быть найден здесь:

http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html

В новом выпуске Django 1.0 это работает точно тот же путь, сойка :)

1
ответ дан 8 December 2019 в 12:24
поделиться

Для JSPs Вы можете иметь свой пирог и съесть его также с тегом c:out, который выходит из XML по умолчанию. Это означает, что можно связать со свойствами как необработанные элементы:

<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" />

При привязке со строкой someName.someProperty будет содержать вход XML, но будучи произведенным к странице, этого автоматически оставят для обеспечения объектов XML. Это особенно полезно для ссылок для проверки страницы.

3
ответ дан 8 December 2019 в 12:24
поделиться

Мое персональное предпочтение состоит в том, чтобы старательно закодировать что-либо, что это прибывает из базы данных, бизнес-слоя или от пользователя.

В ASP.NET это сделано при помощи Server.HtmlEncode(string) .

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

1
ответ дан 8 December 2019 в 12:24
поделиться

Если Вы делаете на самом деле, HTML кодирует каждый вывод, пользователь будет видеть простой текст &lt; html&gt; вместо функционирующего веб-приложения.

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

0
ответ дан 8 December 2019 в 12:24
поделиться

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

echo "blah";

использовать

myecho('blah');

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

В одном проекте у нас был режим отладки в наших функциях вывода, которые сделали весь синтезируемый текст, проходящий наш метод невидимый. Затем мы знали, что что-нибудь на экране HAD, не, вышло! Было очень полезное отслеживание вниз теми непослушными незавершенными битами :)

1
ответ дан 8 December 2019 в 12:24
поделиться

Единственный способ действительно защитить себя от этого вида нападения состоит в том, чтобы строго отфильтровать весь вход, который Вы принимаете, конкретно (хотя не исключительно) от общественных областей Вашего применения. Я рекомендовал бы смотреть на PHP Daniel Morris Фильтрация Класса (полное решение) и также пакет Zend_Filter (набор классов, которые можно использовать для создания собственного фильтра).

PHP является моим предпочтительным языком когда дело доходит до веб-разработки, таким образом, извинения за предвзятость в моем ответе.

Kieran.

0
ответ дан 8 December 2019 в 12:24
поделиться

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

Var dsFirstName, uhsFirstName : String;

Begin

uhsFirstName := request.queryfields.value['firstname'];

dsFirstName := dsHtmlToDB(uhsFirstName);

В основном снабдите префиксом свои переменные что-то как "мы" для небезопасной строки, "ds" для безопасной базы данных, "hs" для безопасного HTML. Вы только хотите закодировать и декодировать, где Вам на самом деле нужен он, не все. Но при помощи их префиксы, которые выводят полезное значение, смотрящее на Ваш код, который Вы будете видеть реальный быстрый, если что-то не будет правильно. И Вы испытываете необходимость отличающийся, кодируют/декодируют функции так или иначе.

0
ответ дан 8 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

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