Надлежащая защита от 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
PreparedStatement
. - person Sotirios Delimanolis   schedule 06.05.2013