Укушенный этим еще раз, отсутствующие ссылки источника библиотеки. Google Hosted Libraries Похожие ссылки
Вам нужно использовать PreparedStatement . например,
String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
PreparedStatement ps = connection.prepareStatement(insert);
ps.setString(1, name);
ps.setString(2, addre);
ps.setString(3, email);
ResultSet rs = ps.executeQuery();
Это предотвратит атаки на инъекции.
Способ, которым хакер помещает его, заключается в том, что строка, которую вы вставляете, поступает от входа где-то - например. поле ввода на веб-странице или поле ввода в форме в приложении или аналогичном.
Вы можете проверить THIS статью за информацию об этом! :)
Я рекомендую параметризованные запросы:
String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();
Вот почему вы должны использовать вопросительные знаки в своих строковых операторах:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
, указанный в здесь
Я хочу знать, как этот кусок кода («DROP TABLE customer;») можно добавить в мою инструкцию insert хакером
blockquote>Например:
name = "'); DROP TABLE customer; --"
даст это значение в insert :
INSERT INTO customer(name,address,email) VALUES(''); DROP TABLE customer; --"','"+addre+"','"+email+"');
Я специально хочу знать, как я могу предотвратить это
< / blockquote>Используйте подготовленные операторы и аргументы SQL (пример «украден» у Matt Fellows):
String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);"; PreparedStament ps = connection.prepareStatment(insert);
Также проанализируйте значения, которые у вас есть на таких переменных, и убедитесь, что они не содержат недопустимые символы (такие как «;» в имени).
Перейти к PreparedStatement Преимущества PreparedStatement:
Предварительная компиляция и кэширование базы данных SQL-оператора приводит к более быстрому выполнению и возможности повторного использования одного и того же оператора SQL в партиях.
Автоматическое предотвращение атак SQL-инъекций путем встроенного экранирования кавычек и других специальных символов. Обратите внимание, что для установки значения
требуется использование любого из методов setXxx () PreparedStatement, Злоумышленник просто должен ввести что-то вроде 'foo@example.com"); DROP TABLE customer;
в поле для email
, и вы закончили.
Вы можете предотвратить это, используя правильное экранирование для JDBC-заявлений.
Как объяснено в этой записи , только PreparedStatement
вам не поможет, если вы все еще конкатенируете строки.
Например, один из злоумышленников-хакеров все еще может сделать следующее:
И это не только SQL, но JPQL и HQL могут быть скомпрометированы, если вы не используете параметры привязки:
PreparedStatement ps = connection.prepareStatement(
INSERT INTO customer(name,address,email) VALUES(?, ?, ?)
);
int index = 0;
ps.setString(++index, name);
ps.setString(++index, address);
ps.setString(++index, email);
ResultSet rs = ps.executeQuery();
В нижней строке вы никогда не должны использовать конкатенацию строк при создании операторов SQL. Используйте специальный API для этой цели: