Подтвердить что ты не робот

Escaping html в Java

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

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

4b9b3361

Ответ 1

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

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

например.

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

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

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

например.

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))");
create.setString(1, username);
create.setString(2, password);
create.executeUpdate();

Ответ 2

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

Ответ 3

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

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