Поиск…


Вступление

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

В этом разделе мы поговорим об этом и его отношении с заявлением JDBC.

Заявление и SQL Injection evil

Примечание. В этом примере мы будем использовать СУБД PostgreSQL, но вы можете использовать любую СУБД

Мы будем использовать базу данных bd_test ведьма содержит Schema: sch_test и две таблицы users и test :

CREATE TABLE sch_test.users
(
  id serial NOT NULL,
  username character varying,
  password character varying,
  CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
) 

CREATE TABLE sch_test.test
(
  id serial NOT NULL,
  "column" character varying
)

Простой вход в систему с использованием Statement

static String DRIVER = "org.postgresql.Driver";
static String DB_USERNAME = "postgres";
static String DB_PASSWOR = "admin";
static String DB_URL = "jdbc:postgresql://localhost:5432/bd_test";

public static void sqlInjection() {
    try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWOR);
        Statement statement = connection.createStatement();
        String username = "admin";
        String password = "admin";
        String query = "SELECT * FROM sch_test.users where username = '" 
                + username + "' and password = '" + password + "'";

        ResultSet result = statement.executeQuery(query);

        if (result.next()) {
            System.out.println("id = " + result.getInt("id") + " | username = "
                    + result.getString("username") + " | password = " + result.getString("password"));
        }else{
           System.out.println("Login not correct");
        }

    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

До сих пор все нормально и безопасно.

Вход с псевдонимом и паролем

Хакер или тестер могут просто войти или перечислить всех ваших пользователей, используя это:

String username = " ' or ''='";
String password = " ' or ''='";

INSERT новый пользователь

Вы можете вставлять данные в таблицу, используя:

String username = "'; INSERT INTO sch_test.utilisateur(id, username, password) 
                        VALUES (2, 'hack1', 'hack2');--";
String password = "any";

УДАЛИТЬ Все пользователи

подумайте, хакер знает схему вашей базы данных, чтобы он мог удалить всех ваших пользователей

String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any"; 

Пользователи DROP Table

Хакер также может удалить таблицу

String username = "'; drop table sch_test.table2;--";
String password = "any";

DROP DATABASE

Хуже всего - отказаться от базы данных

String username = "'; DROP DATABASE bd_test;--";
String password = "any";

и есть много других.

Почему все это?

Все это из-за того, что Statement недостаточно безопасен, он выполняет запрос, как и он, поэтому рекомендуется использовать PreparedStatement , более безопасно это Statement .

Вы можете найти здесь подробности PreparedStatement



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow