Предотвращение атак SQL Injection в java MySQL [дубликат]

Укушенный этим еще раз, отсутствующие ссылки источника библиотеки. Google Hosted Libraries Похожие ссылки

11
задан Grant 5 March 2012 в 20:54
поделиться

7 ответов

Вам нужно использовать 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();

Это предотвратит атаки на инъекции.

Способ, которым хакер помещает его, заключается в том, что строка, которую вы вставляете, поступает от входа где-то - например. поле ввода на веб-странице или поле ввода в форме в приложении или аналогичном.

20
ответ дан Matt Fellows 24 August 2018 в 03:59
поделиться

Вы можете проверить THIS статью за информацию об этом! :)

Я рекомендую параметризованные запросы:

String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();
7
ответ дан aF. 24 August 2018 в 03:59
поделиться

Вот почему вы должны использовать вопросительные знаки в своих строковых операторах:

 PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

, указанный в здесь

2
ответ дан dimitrisli 24 August 2018 в 03:59
поделиться

Я хочу знать, как этот кусок кода («DROP TABLE customer;») можно добавить в мою инструкцию insert хакером

Например:

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);

Также проанализируйте значения, которые у вас есть на таких переменных, и убедитесь, что они не содержат недопустимые символы (такие как «;» в имени).

12
ответ дан m0skit0 24 August 2018 в 03:59
поделиться

Перейти к PreparedStatement Преимущества PreparedStatement:

Предварительная компиляция и кэширование базы данных SQL-оператора приводит к более быстрому выполнению и возможности повторного использования одного и того же оператора SQL в партиях.

Автоматическое предотвращение атак SQL-инъекций путем встроенного экранирования кавычек и других специальных символов. Обратите внимание, что для установки значения

требуется использование любого из методов setXxx () PreparedStatement,
0
ответ дан Mukesh Kumar 24 August 2018 в 03:59
поделиться

Злоумышленник просто должен ввести что-то вроде 'foo@example.com"); DROP TABLE customer; в поле для email, и вы закончили.

Вы можете предотвратить это, используя правильное экранирование для JDBC-заявлений.

5
ответ дан user 24 August 2018 в 03:59
поделиться

Как объяснено в этой записи , только 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 для этой цели:

1
ответ дан Vlad Mihalcea 24 August 2018 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: