MySQL – насоки за сигурност при програмиране

Приложенията, които достъпват MySQL, не трябва да се доверяват на въведените от потребителите данни. Злонамерени лица могат да се опитат да измамят кода, като въвеждат специална (escaped) последователност от знаци в уеб формуляри, URL адреси или каквото и да е клиентско приложение.

Уверете се, че приложението Ви остава сигурно, ако потребителят въведе подобен код:

DROP DATABASE mysql;

Това е екстремен пример, но големи проблеми със сигурността и загуба на данни може да възникнат в резултат на хакерски атаки, които използват подобни техники, ако Вие (по-скоро приложението) не сте подготвени за тях.

Защита на цифрови данни

Често срещана грешка е да се защитят само стойностите на низовите (текстови) данни. Не забравяйте да проверите и цифровите данни. Ако дадено приложение генерира следната заявка:

SELECT * FROM table WHERE ID=234

когато потребителят вместо да въведе само стойност 234, въведе стойността (или последователността от знаци) 234 OR 1 = 1, което става причина приложението да генерира заявката:

SELECT * FROM table WHERE ID=234 OR 1=1

Тъй като 1=1 условието OR е винаги изпълнено, сървърът показва всеки ред в таблицата. По този начин се предоставя цялото съдържание на таблицата и се предизвиква прекомерно натоварване на сървъра.

Най-лесният начин за защита от този тип атака е да се използват единични кавички около цифровите константи:

SELECT * FROM table WHERE ID='234'

Ако потребителят въведе допълнителна информация, всичко става част от низа. Тъй като за това поле е дефиниран цифров тип на информацията (integer, INT), MySQL автоматично преобразува този низ в число и премахва всички останали не-цифрови знаци от него.

Теорията, че ако дадена база данни съдържа само публично достъпни данни, не е необходимо да бъде защитена, е погрешна.

Дори ако е допустимо да се показва всеки ред в базата данни, трябва да има механизъм на защита от DoS (отказване на услуга) атака. В противен случай Вашият сървър няма да отговаря на заявки от легитимни потребители.

Проверка сигурността на приложение

  • Активирайте strict SQL mode, за да работи сървърът в ограничителен режим по отношение на това какви данни приема. MySQL сървърът може да работи в различни SQL режими и може да прилага тези режими по различен начин за различните клиенти в зависимост от стойността на системната променлива sql_mode. Режимите засягат SQL синтаксиса, поддържан от MySQL, и проверките за валидиране на данните.
  • Опитайте да въведете единични и двойни кавички (' and ") във всички контактни уеб форми. Ако получите MySQL грешка, незабавно проверете проблема.
  • Опитайте се да промените динамичните URL адреси, като добавите към тях %22 („),%23 (#) и %27 (‘).
  • Опитайте да промените типовете данни в динамични URL адреси от цифрови в буквени знаци, като използвате знаците, показани в предишните примери. Вашето приложение трябва да е защитено срещу тези и подобни атаки.
  • Опитайте се да въвеждате букви, интервали и специални символи, а не числа в цифрови полета. Приложението трябва да ги премахне, преди да ги запише в MySQL или да генерира грешка. Не допускайте приемане на непроверени стойности в MySQL.
  • Проверете размера на данните, преди да се запишат в MySQL.
  • Свържете приложението си към базата данни, като използвате потребителско име, различно от това, което използвате за административни цели.
  • Не давайте на приложенията си привилегии за достъп, от които не се нуждаят.

Сигурност на интерфейси за програмиране

Много интерфейси за програмиране на приложения осигуряват средства за избягване (escaping) на специални знаци в стойностите на данните. Когато се използват правилно, потребителите на приложенията не могат да въвеждат стойности, които карат приложението да генерира заявки, които имат различен ефект от този, който разработчиците са имали предвид:

MySQL C API: Използвайте функцията mysql_real_escape_string_quote().

MySQL ++: Използвайте модификатори (escape and quote) в заявките.

PHP: Използвайте разширенията mysqli или pdo_mysql вместо старото разширение ext/mysql. API (приложни програмни интерфейси) поддържат MySQLi протокола за удостоверяване, както и prepared statements със заместващи символи (placeholders).

Ако трябва да се използва по-старото разширение ext/mysql, тогава за escaping използвайте mysql_real_escape_string_quote(), вместо mysql_escape_string() или addslashes(), защото само mysql_real_escape_string_quote () е чувствителен относно шрифта (character set-aware). Другите функции могат да бъдат заобиколени, когато се използва (невалиден) многобайтов набор от знаци (multibyte character sets).

Perl DBI: Използвайте заместващи символи или метода quote().

Ruby DBI: Използвайте заместващи символи или метода quote().

Java JDBC: Използвайте Prepared Statements обекти и заместващи символи (placeholders).

Други програмни интерфейси могат да имат сходни възможности.

Обновена: 18.03.2022
Беше ли Ви полезна тази статия?

Вижте още