Как мы можем предотвратить SQL-инъекцию из MySQL? - PullRequest
0 голосов
/ 14 октября 2019

Мы все знаем, что мы можем предотвратить SQL-инъекцию в PHP с помощью подготовленного оператора запроса или функции mysqli_real_escape_string (). Но если я хочу предотвратить это со стороны MySQL? Есть ли у вас какие-либо идеи? Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Как говорится в комментарии @Ferrybig, на стороне MySQL нет никакого способа убедиться, что запрос SQL является законным или является результатом внедрения SQL.

Предположим, сервер базы данных получает этот запрос:

SELECT col1, col2, col3 FROM MyTable WHERE account_id = 1 
UNION SELECT user, password, NULL FROM mysql.user

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

Другой пример:

SELECT col1, col2, col3 FROM MyTable WHERE account_id = 1
OR account_id = 473

Это законно? Или это незаконно? Выполняется ли запрос для пользователя, который должен иметь права на чтение данных для учетной записи 473? Как ты можешь знать? На стороне MySQL запрос выглядит точно так же, независимо от того, был ли он результатом внедрения SQL.

Это мог быть код, подобный следующему PHP, который уязвим для внедрения SQL (это не ошибкаPHP, потому что подобный уязвимый код может быть написан на любом языке программирования):

$sql = "SELECT col1, col2, col3 FROM MyTable WHERE account_id = " . $_GET['id'];

Если злоумышленник вызвал входной параметр: "1 OR account_id = 473"

Дело в том, как толькозапрос отформатирован в приложении и отправлен в MySQL, MySQL не может сказать, как он был отформатирован. MySQL может доверять только тому, что разработчик кода действительно отформатировал запрос безопасным способом.

Один из методов блокирования незаконных запросов - использование типа межсетевого экрана веб-приложений (WAF) , которыйВы разрабатываете, чтобы распознавать допустимые входные данные и блокировать запросы, которые не являются законными. Другими словами, вам нужно запрограммировать WAF с помощью белого списка или набора шаблонов для распознавания безопасных запросов. Этот список будет уникальным для каждого приложения, поэтому вы должны быть очень хорошо знакомы с приложением. Любая модификация приложения может потребовать обновления белого списка WAF.

WAF обычно является прокси-сервером на уровне http, чтобы предотвратить попадание незаконного запроса в веб-приложение. Существуют также прокси-решения для защиты запроса между приложением и базой данных. Вы программируете прокси-сервер для определения ожидаемых запросов SQL, и он блокирует любые запросы с неожиданными условиями. Это будет

Пример брандмауэра базы данных: https://www.oracle.com/database/technologies/security/audit-vault-firewall.html

Они не идеальны. Они могут блокировать запросы, которые вы хотите разрешить. И они не работают для динамических запросов, выполняемых в хранимых процедурах.

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

0 голосов
/ 16 октября 2019

Вы можете использовать, предполагая, что вы вводите параметр $ bookID

DELIMITER $$

CREATE PROCEDURE `spGetBook`(
in bookID int)
BEGIN
   SELECT *
   FROM categories
   where bookID=bookID;
END $$
0 голосов
/ 14 октября 2019

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

Вот пример хранимой процедуры, которую можно использовать для вставки записи в mysql -

DELIMITER $$
CREATE PROCEDURE book_Insert (
in title varchar(30),
in isbn varchar(30),
out bookID tinyint(3) unsigned
)
BEGIN
insert into books (title, isbn) 
    values(title, isbn);
set bookID =last_insert_id();
END $$
...