Поиск…


Вступление

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

Образец инъекции SQL

Предполагая, что вызов обработчика входа вашего веб-приложения выглядит так:

https://somepage.com/ajax/login.ashx?username=admin&password=123

Теперь в login.ashx вы читаете эти значения:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

и запросите свою базу данных, чтобы определить, существует ли пользователь с этим паролем.

Итак, вы строите строку запроса SQL:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

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

Однако, если один из параметров содержит цитату, SQL, который отправляется в базу данных, будет выглядеть так:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

Это приведет к синтаксической ошибке, потому что цитата после d в d'Alambert заканчивает строку SQL.

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

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

Однако более целесообразно использовать параметры:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

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

Например, если злоумышленник злодей, он / она установит пароль для

lol'; DROP DATABASE master; -- 

и тогда SQL будет выглядеть так:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

К сожалению, для вас это действительный SQL, и БД выполнит это!

Этот тип эксплойта называется SQL-инъекцией.

Есть много других вещей, которые мог бы совершить злонамеренный пользователь, например, кражи каждого адреса электронной почты каждого пользователя, кражи пароля каждого пользователя, кражи номеров кредитных карт, кражи любого количества данных в вашей базе данных и т. Д.

Вот почему вам всегда нужно избегать ваших строк.
И тот факт, что вы непременно забудете сделать это рано или поздно, именно поэтому вы должны использовать параметры. Потому что, если вы используете параметры, ваша система языка программирования сделает все необходимое для вас.

простой образец для инъекций

Если инструкция SQL построена следующим образом:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

Затем хакер может получить ваши данные, указав пароль как pw' or '1'='1 ; результирующий оператор SQL будет выглядеть следующим образом:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

Это проверит проверку пароля для всех строк в таблице « Users потому что '1'='1' всегда истинно.

Чтобы предотвратить это, используйте параметры SQL:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


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