Как настроить Spring Controller и/или JAXB, чтобы предотвратить внедрение SQL/XSS

У меня есть контроллер в Spring с таким методом, как следующий

@RequestMapping(value = "/v1/something", method = RequestMethod.POST, headers = "content-type=application/xml")
@Valid
public void something(@RequestBody final SomeBody myDto  . . . . .

Я хочу быть уверенным, что тело запроса не содержит никаких символов SQL или Javascript, чтобы избежать SQL-инъекций, XSS-атак и т. д.

JAXB уже справляется с этим сценарием? Я подумывал написать фильтр, но могу ли я прочитать тело запроса только один раз?

Какие-либо предложения?


person kellyfj    schedule 06.05.2013    source источник
comment
Я бы не стал заниматься предотвращением SQL-инъекций на таком уровне. JDBC уже имеет множество механизмов предотвращения с помощью PreparedStatement.   -  person Sotirios Delimanolis    schedule 06.05.2013
comment
Хорошо, но как насчет атак с внедрением Javascript (XSS).   -  person kellyfj    schedule 07.05.2013


Ответы (3)


Надлежащая защита от XSS и SQL-инъекций (и проверка данных в целом) может происходить только на стороне сервера. Проверка на стороне клиента не имеет значения, поскольку злоумышленник может просто написать свой собственный клиент или отправить собственный HTTP-запрос. Проверка на стороне клиента полезна только для уведомления незлонамеренных пользователей о проверке формы без обращения к серверу (например, проверка того, что поле является числом или адресом электронной почты). Даже в этой ситуации сервер также должен выполнить проверку.

Чтобы предотвратить внедрение SQL, используйте переменные связывания (например, подготовленные операторы) для всех параметризованных запросов. Вам никогда не придется объединять входные данные клиента для создания оператора SQL. Если вы никогда не генерируете операторы SQL из клиентского ввода и используете их только как переменные связывания, вам вообще не нужно беспокоиться о внедрении SQL.

String clientValue = ...
Connection conn = ...
PreparedStatement stmt = conn.prepare("INSERT INTO foobar VALUES (?)");
stmt.setString(clientValue);
stmt.executeUpdate();

Или с Spring JDBC:

String clientValue = ...
JdbcTemplate jdbcTemplate = ...
jdbcTemplate.update("INSERT INTO foobar VALUES (?)", clientValue);

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

Например, если вы используете JSTL для вывода своего вывода, вы должны использовать что-то вроде:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
${fn:escapeXml(myModelVariable)}
person sehrope    schedule 15.05.2013

Вы можете использовать Filters для очистки форм. Он извлечет все атрибуты вашего запроса и очистит их все. Другой вариант — использовать JSoup API. посетите следующие ссылки, чтобы узнать больше.

JSoup XSS API

Фильтрация для предотвращения XSS-угроз

РЕДАКТИРОВАТЬ:

Прочтите листы OWASP, чтобы узнать, как избежать внедрения XSS и SQL.

OWASP — предотвращение XSS

OWASP — предотвращение SQL-инъекций

Взгляните на HDIV, который интегрируется с Spring 3.1, имеет встроенную поддержку XSS, CSRF, Проверки целостности данных.

person Jeevan Patil    schedule 09.05.2013

Для атак XSS в основном используется взлом на стороне клиента. Для каждого пользовательского ввода вы можете фактически дезинфицировать входные данные с помощью кодирования, чтобы он удалял все специальные символы. Основной способ обработки на стороне клиента — использовать функцию escape() Javascript. OWASP — хороший справочник по длинному списку взломов на стороне клиента. Для взлома на стороне сервера для предотвращения внедрения SQL вы можете использовать подготовленные операторы или создание запросов на основе шаблонов (QueryDSL) или HQL и т. д.

person Rohitdev    schedule 14.05.2013