RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Безопасные SQL запросы

SQL-инъекция (SQL injection) — один из способов взлома сайтов, работающих с использованием SQL баз данных. Используется внедрение своего SQL-кода. Этот тип атак на сайты один из самых популярных в сети интернет. Последствий атаки с использованием инъекций могут быть непоправимы. Обычно атаки подобного рода направлены на то чтобы получить доступ к базе данных, учетным записям и так далее, но так же возникает огромная угроза полного уничтожения базы данных, что приведет его к нерабочему состоянию.

Преодоление последствий нападения инъекции SQL это одно, но предотвращение их это совершенно другое. Этот статья объясняет, каким образом мы можем обеспечить безопасность на сайте Joomla, с использованием Framework Joomla. Для получения дополнительной информации о инъекции SQL, обратитесь к CWE-89.


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

$db = JFactory::getDBO();

Существует два основных метода обращения к записям из таблицы MySQL:

  • По идентификаторам и именам
  • По строковым значениям

Метод JDatabase::nameQuote() - используется для безопасного представления идентификаторов и имен. Для начала мы это продемонстрируем на простом примере с одним идентификатором:

$name = $db->nameQuote('columnIdentifier');

Если вам необходимо несколько раз произвести эту операцию, например для идентификатора разделенного точкой (таблица.колонка), то нужно каждый из них пропустить через метод nameQuote(), примерно так:

// Подготавливаем идентификаторы
$tableIdentifier  = $db->nameQuote('tableIdentifier');
$columnIdentifier = $db->nameQuote('columnIdentifier');

// Создаем полное имя
$name = "$tableIdentifier.$columnIdentifier";

Теперь разберем выборки с использованием слов как идентификаторов. В MySQL все строковые значения должны обрамляться одинарной либо двойной кавычкой. Вроде в этом нет никаких сложностей, до тех пор пока наша строка не будет содержать эти кавычки как часть себя. с помощью метода JDatabase::Quote() мы больше можем не обращать внимание на тексты подобного рода. Например:

$tableIdentifier  = $db->nameQuote('tableIdentifier');
$columnIdentifier = $db->nameQuote('columnIdentifier');
$sql = "SELECT * FROM $tableIdentifier " 
     . "WHERE $columnIdentifier "
     . ' = ' . $db->Quote("How's the recipe\book going?");

Метод JDatabase::Quote() просто с учетом текущего типа базы данных экранирует нежелательные символы в итоге из строки

How's the recipe\book going?

получаем следующее

'How\'s the recipe\\book going?'

Текст окружен кавычками и все спец символы экранированы.

Обратиться к записи можно не только по словам, но и числам как целым так и с плавающей запятой. Для проверки обычно используется функции int, intval, (float), floatval. Использование в примере ниже.

 // целые числа
$safeNumber = (int)$unsafeValue;
$safeNumber = intval($unsafeValue);

// числа с плавающей запятой
$safeNumber = (float)$unsafeValue;
$safeNumber = floatval($unsafeValue);

В большинстве случаев данные на сайт передаются через POST или GET методы. Для проверки этих переменных удобно пользоваться специальным классом JRequest. Простой пример использования JRequest:

// целые числа
$safeInt = JRequest::getInt('int');
$safeInt = JRequest::getVar('int', 0, 'DEFAULT', 'INT');
$safeInt = JRequest::getVar('int', 0, 'DEFAULT', 'INTEGER');

// числа с плавающей точкой
$safeFlt = JRequest::getFloat('float');
$safeFlt = JRequest::getVar('float', 0, 'DEFAULT', 'FLOAT');
$safeFlt = JRequest::getVar('float', 0, 'DEFAULT', 'DOUBLE');

Есть более сложный способ фильтрации данных - через класс JFilterInput. Используется он по тому же принципу, что и JRequest.

// получаем экземпляр фильтра 
$filter = JFilterInput::getInstance();
// целые числа
$safeInt = $filter->clean($unsafeValue, 'INT');
$safeInt = $filter->clean($unsafeValue, 'INTEGER');
// числа с плавающей запятой
$safeFlt = $filter->clean($unsafeValue, 'FLOAT');
$safeFlt = $filter->clean($unsafeValue, 'DOUBLE');

Какие либо данные, например числа можно взять в кавычки с помощью метода Quote базы данных:

$db->Quote((int)$unsafeValue);

В MySQL существует всего 6 различных типов, которые могут храниться как строка:

  • Строка
  • Номер
  • NULL
  • Шестнадцатеричное число
  • Булево значение
  • Bit filed

Давайте рассмотрим, как безопасно можно работать с этими типами данных MySQL.

NULL

NULL - это полное отсутствие всяких данных. Например пустая строка это не NULL. Это значение всегда должно быть записано в виде NULL либо \N.

$safeValue = ($unsafeValue == 'NULL') ? 'NULL' : 'NOT NULL';

Шестнадцатеричное число (Hexadecimal)

Для Joomla использовать шестнадцатеричные числа - это большая редкость. Поэтому в её функционале не предусмотрен такой тип данных. Но если у вас все таки возникла такая необходимость, то для проверки воспользуйтесь следующим кодом:

$matches = array();
$pattern = "~^([Xx]\'|0x)([0-9A-F]+)\'?$~";
$safeHex = $defaultSafeHexValue;
if (preg_match($pattern, $unsafeValue, $matches)) {
    $safeHex = "x'" . $matches[2] . "'";
}

Булевы значения (Boolean)

Проверка булевых типов очень проста. Если что-то пришло, то TRUE, в противном случае - FALSE:

$boolean = ($unsafeValue) ? 'TRUE' : 'FALSE' ;

Bit Field

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

$matches = array();
$pattern = "~^(b\'|0b)([01]+)\'?$~";
$safeBin = $defaultSafeBinValue;
if (preg_match($pattern, $unsafeValue, $matches)) {
    $safeBin = "b'" . $matches[2] . "'";
}

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

Смотрите также:
Комментарии (8) Добавить комментарий
  • tinyurl.com
    tinyurl.com
    24 Ноября 2019, 06:03
     ↑  0  ↓     ответ

    This post will help the internet visitors for setting up new

    web site or even a weblog from start to end.

  • tinyurl.com
    tinyurl.com
    25 Ноября 2019, 02:32
     ↑  0  ↓     ответ

    That is really attention-grabbing, You are a very skilled blogger.

    I have joined your rss feed and stay up for seeking extra

    of your magnificent post. Additionally, I've shared your website in my social

    networks

  • coconut oil the
    coconut oil the
    25 Ноября 2019, 17:21
     ↑  0  ↓     ответ

    Hi there! This is my first visit to your blog! We are a team of volunteers and starting a new project

    in a community in the same niche. Your blog provided

    us valuable information to work on. You have done a wonderful job!

  • plenty of fish dating site
    plenty of fish dating site
    27 Ноября 2019, 03:28
     ↑  0  ↓     ответ

    If some one desires expert view regarding blogging after that i propose

    him/her to go to see this blog, Keep up the pleasant job.

  • g
    g
    16 Июня 2020, 02:16
     ↑  0  ↓     ответ

    You can definitely see your enthusiasm within the article you

    write. The world hopes for even more passionate writers like you who are not afraid to say how

    they believe. At all times go after your heart.

  • g
    g
    16 Июня 2020, 13:55
     ↑  0  ↓     ответ

    When some one searches for his essential thing, so he/she desires to be available that in detail, therefore that thing is maintained over

    here.

  • g
    g
    17 Июня 2020, 01:58
     ↑  0  ↓     ответ

    I blog frequently and I really thank you for your content.

    This article has truly peaked my interest.

    I am going to book mark your site and keep checking for new details about once a week.

    I opted in for your RSS feed as well.

  • g
    g
    18 Июня 2020, 02:07
     ↑  0  ↓     ответ

    Your method of explaining everything in this paragraph is actually good, every one be

    capable of without difficulty understand it, Thanks a lot.

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.