По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .
Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет 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.
В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .
ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .
Если значение получено из ненадежного источника, могу ли я использовать API для безопасного задания значения без дополнительной предварительной обработки?
blockquote>Нет, вы может нет. 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)); // ...
В качестве альтернативы вы также можете использовать регулярное выражение, чтобы предварительно удалить все незаконные символы , Разрешены только буквенные символы, цифры, дефисы, подчеркивания, периоды, тильды и, возможно, еще несколько (зависит от браузера!). Все остальные должны быть удалены.