Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
| = Donate = |
Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
SQL-инъекция (SQL injection) — один из способов взлома сайтов, работающих с использованием SQL баз данных. Используется внедрение своего SQL-кода. Этот тип атак на сайты один из самых популярных в сети интернет. Последствий атаки с использованием инъекций могут быть непоправимы. Обычно атаки подобного рода направлены на то чтобы получить доступ к базе данных, учетным записям и так далее, но так же возникает огромная угроза полного уничтожения базы данных, что приведет его к нерабочему состоянию.
Преодоление последствий нападения инъекции SQL это одно, но предотвращение их это совершенно другое. Этот статья объясняет, каким образом мы можем обеспечить безопасность на сайте Joomla, с использованием Framework Joomla. Для получения дополнительной информации о инъекции SQL, обратитесь к CWE-89.
Для начала просто получим ссылку на глобальный объект Joomla отвечающий за базу данных сайта Joomla.
Существует два основных метода обращения к записям из таблицы MySQL:
Метод JDatabase::nameQuote() - используется для безопасного представления идентификаторов и имен. Для начала мы это продемонстрируем на простом примере с одним идентификатором:
Если вам необходимо несколько раз произвести эту операцию, например для идентификатора разделенного точкой (таблица.колонка), то нужно каждый из них пропустить через метод nameQuote(), примерно так:
Теперь разберем выборки с использованием слов как идентификаторов. В MySQL все строковые значения должны обрамляться одинарной либо двойной кавычкой. Вроде в этом нет никаких сложностей, до тех пор пока наша строка не будет содержать эти кавычки как часть себя. с помощью метода JDatabase::Quote() мы больше можем не обращать внимание на тексты подобного рода. Например:
Метод JDatabase::Quote() просто с учетом текущего типа базы данных экранирует нежелательные символы в итоге из строки
получаем следующее
Текст окружен кавычками и все спец символы экранированы.
Обратиться к записи можно не только по словам, но и числам как целым так и с плавающей запятой. Для проверки обычно используется функции int, intval, (float), floatval. Использование в примере ниже.
В большинстве случаев данные на сайт передаются через POST или GET методы. Для проверки этих переменных удобно пользоваться специальным классом JRequest. Простой пример использования JRequest:
Есть более сложный способ фильтрации данных - через класс JFilterInput. Используется он по тому же принципу что и JRequest.
Какие либо данные, например числа можно взять в кавычки с помощью метода Quote базы данных:
В MySQL существует всего 6 различных типов, которые могут храниться как строка:
Давайте рассмотрим, как безопасно можно работать с этими типами данных MySQL.
NULL
NULL - это полное отсутствие всяких данных. Например пустая строка это не NULL. Это значение всегда должно быть записано в виде NULL либо \N.
Шестнадцатеричное число (Hexadecimal)
Для Joomla использовать шестнадцатеричные числа - это большая редкость. Поэтому в её функционале не предусмотрен такой тип данных. Но если у вас все таки возникла такая необходимость, то для проверки воспользуйтесь следующим кодом:
Булевы значения (Boolean)
Проверка булевых типов очень проста. Если что-то пришло, то TRUE, в противном случае - FALSE:
Bit Field
Двоичные значения также редкость в расширениях Joomla. Опять же специальных готовых методов для этого не предусмотрено, поэтому воспользуемся следующим способом:
Если у вас есть возможность не использовать особенные типы данных, то лучше не подвергать себя угрозе и пользоваться обычными значениями.