Экранирование HTML в Java - PullRequest
       56

Экранирование HTML в Java

13 голосов
/ 27 января 2010

Как мне сделать так, чтобы я не избежал чего-то дважды?

Я слышал, что рекомендуется избегать значений при их получении из формы, а также при выходе. Таким образом, у вас есть два шанса что-то поймать.

Ответы [ 3 ]

18 голосов
/ 27 января 2010

Я предполагаю, что вы используете JSP.

Просто сбежать во время отображения только. Там для тега JSTL <c:out> отлично подходит. По умолчанию он экранирует сущности HTML. Используйте его для отображения каждого пользовательского ввода, такого как URL запроса, заголовки запроса и параметры запроса.

* 1014 Е.Г. *

<input type="text" name="foo" value="<c:out value="${param.foo}" />">

Экранирование во время ввода не требуется. XSS не наносит вреда ни в исходном коде Java, ни в базах данных SQL. С другой стороны, вы также предпочли бы сохранить данные без изменений в БД, чтобы вы могли по-прежнему видеть, что пользователь на самом деле ввел, чтобы вы могли при необходимости выполнять социальные действия с вредоносными пользователями.

Если вы хотите знать, что следует избегать во время ввода, это будет SQL-инъекция . В таком случае просто используйте PreparedStatement вместо обычного Statement всякий раз, когда вы хотите сохранить любой контролируемый пользователем ввод в базу данных.

1033 * Е.Г. *

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))");
create.setString(1, username);
create.setString(2, password);
create.executeUpdate();
3 голосов
/ 27 января 2010

Вы должны только html кодировать, когда вы выводите что-то в браузер. Это предотвращает атаки XSS. Экранирование, которое вы делаете при сборе данных из формы перед вставкой в ​​базу данных, - это , а не html-кодировка. Это экранирование специальных символов базы данных (лучше всего делать с помощью параметризованных запросов). Целью этого является предотвращение атак с использованием SQL-инъекций. Таким образом, двойного кодирования не происходит.

2 голосов
/ 27 января 2010

Содержимое, которое является безвредным в одном контексте, может быть опасным в другом контексте. Лучший способ избежать инъекционных атак - это подготовить контент перед его передачей в другой контекст. В вашем случае HTML-текст меняет свой контекст, когда он передается в браузер. Сервер не отображает HTML, а браузер. Поэтому обязательно передайте вредоносный html в браузер и замаскируйте его перед отправкой.

Другим аргументом для этого является то, что код атаки может быть собран внутри приложения из двух или более входов. Каждый из входов был безвредным, но вместе они могут стать опасными.

...