Хранить массив в cookie в сервлете [дубликат]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

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

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

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

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

7
задан Vilmantas Baranauskas 29 July 2011 в 08:23
поделиться

1 ответ

Если значение получено из ненадежного источника, могу ли я использовать API для безопасного задания значения без дополнительной предварительной обработки?

Нет, вы может нет. API не позаботится об этом для вас. В противном случае это было бы явно указано в Javadoc. API может не знать заранее, если вы используете файлы cookie версии 0 ( Netscape ) или версии 1 ( RFC2965 ).

Лучше всего было бы просто URL-кодирование имени / значения cookie заранее, чтобы вы могли убедиться, что в конечном итоге вы получите безопасное имя / значение cookie.

String safeCookieName = URLEncoder.encode(name, "UTF-8");
String safeCookieValue = URLEncoder.encode(value, "UTF-8");
response.addCookie(new Cookie(safeCookieName, safeCookieValue));
// ...

В качестве альтернативы вы также можете использовать регулярное выражение, чтобы предварительно удалить все незаконные символы , Разрешены только буквенные символы, цифры, дефисы, подчеркивания, периоды, тильды и, возможно, еще несколько (зависит от браузера!). Все остальные должны быть удалены.

6
ответ дан BalusC 24 August 2018 в 00:31
поделиться
Другие вопросы по тегам:

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