Как убедиться, что я не убегаю что-то дважды?
Я слышал, что его хорошая практика - избегать значений, когда вы получаете их из формы, а также убегаете при выходе. Таким образом у вас есть два шанса поймать что-то.
Как убедиться, что я не убегаю что-то дважды?
Я слышал, что его хорошая практика - избегать значений, когда вы получаете их из формы, а также убегаете при выходе. Таким образом у вас есть два шанса поймать что-то.
Я предполагаю, что вы используете 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();
Вы должны только кодировать html при выводе чего-либо в браузер. Это предотвращает атаки XSS. Вид экранирования, который вы делаете, когда вы собираете данные из формы, прежде чем вставлять их в базу данных, не является кодировкой html. Это ускользает от специальных символов базы данных (лучше всего использовать с параметризованными запросами). Целью этого является предотвращение атак SQL-инъекций. Таким образом, двойного кодирования не происходит.
Содержание, которое безвредно в одном контексте, может быть опасным в другом контексте. Лучший способ избежать инъекционных атак - подготовить контент, прежде чем передавать его в другой контекст. В вашем случае текст html изменяет свой контекст, когда он передается в браузер. Сервер не отображает html, но браузер делает. Поэтому не забудьте передать вредоносный HTML-код в браузер и замаскировать его перед отправкой.
Другим аргументом в пользу этого является то, что может быть возможным, чтобы код атаки был собран в приложении из двух дополнительных ресурсов. Каждый из входов был безвреден, но вместе они могут стать опасными.