admin / 10.07.2018
Содержание
Для того, чтобы начать изучать SQL нам нужно сначала понять, что такое база данных.
База данных (БД) — упорядоченный набор логически взаимосвязанных данных, используемых совместно, и которые хранятся в одном месте. Если коротко, то простейшая БД это обычная таблица со строками и столбцами в которой хранится разного рода информация (примером может служить таблица в Excel ). Так, часто, с БД нераздельно связывают Системы управления базами данных (СУБД), которые предоставляют функционал для работы с БД. Язык SQL как раз и является частью СУБД, которая осуществляет управление информацией в БД. Мы будем считать БД набором обычных таблиц, которые хранятся в отдельных файлах.
Итак, переходим к SQL.
SQL — простой язык программирования, который имеет немного команд и которой может научиться любой желающий. Расшифровывается как Structured Query Language — язык структурированных запросов, который был разработан для работы с БД, а именно, чтобы получать /добавлять /изменять данные, иметь возможность обрабатывать большие массивы информации и быстро получать структурированную и сгруппированную информацию. Есть много вариантов языка SQL, но у них всех основные команды почти одинаковы. Также существует и много СУБД, но основными из них являются: Microsoft Access, Microsoft SQL Server, MySQL, Oracle SQL, IBM DB2 SQL, PostgreSQL та Sybase Adaptive Server SQL. Чтобы работать с SQL кодом, нам понадобится одна из вышеперечисленных СУБД. Для обучения мы будем использовать СУБД Microsoft Access .
SQL как и другие языки программирования имеет свои команды (операторы), с помощью которых отдаются инструкции для выборки данных. Чтобы рассмотреть как работают операторы SQL, мы будем использовать мнимую БД с информацией о реализованной продукции:
Эта статья является статьёй-квестом. Мы желаем вам успехов в его прохождении. Итоги вашего прохождения будут опубликованы позже (следите за новостями в соц. сетях), а также всем прошедшим в дальнейшем будет выслан инвайт для регистрации на сайте.
Ставьте лайки, делитесь с друзьями и коллегами, репостите в соц.сетях.
Все программисты читали или по крайней мере слышали о методах взлома безопасности веб-сайта. Или даже столкнулись с этой проблемой. С другой стороны, бесконечна фантазия тех, кто хочет сломать сайт, поэтому все узкие места должны быть хорошо защищены. Вот почему я хотел бы начать серию коротких статей, где будут представлены основные методы и приемы взлома веб-сайтов.
В первой статье я хотел бы описать и разъяснить некоторые общие методы взлома одного из самых уязвимых частей сайта — форм. Я буду подробно останавливаться на том, как использовать эти методы и как предотвратить атаки, а также расскажу о тестировании безопасности.
SQl-инъекция — это такая техника, когда злоумышленник вводит команды SQL в input поле на веб-странице. Этим imput`ом может быть что угодно — текстовое поле в форме, параметры _GET и _POST, cookies и т. д. Этот метод был весьма эффективным до появления фреймворков в мире PHP. Но этот способ взлома может быть по-прежнему опасен, если вы не используете ORM или какие-либо еще расширения для data object. Почему? Из-за способа передачи параметров в SQL запрос.
Давайте начнем с классического примера SQL-statement`а, возвращающего пользователя по его логину и хешу от пароля (страница входа)
Пример 1
mysql_query('SELECT id, login FROM users WHERE login = ? and password = hash(?)');
Я подставил вопросительные знаки в выражение из-за различных вариаций этого решения. Первый вариант, на мой взгляд, самый уязвимый:
Пример 1а
mysql_query('SELECT id, login FROM users WHERE login = "' . $login . '" and password = hash("' . $password . '")');
В этом случае в коде нет проверки на ввод неправильных данных. Значения передаются прямо из формы ввода в SQL запрос. В самом лучшем случае пользователь введет здесь свои логин и пароль. Что случится в худшем случае? Давайте попробуем хакнуть эту форму. Это можно сделать, передав "подготовленные" данные. Попытаемся войти как первый пользователь из базы данных, а в большинстве случаев — это админский аккаунт. Для этого, передадим специальную строку вместо ввода логина:
" OR 1=1; —
Первая кавычка может быть и одинарной, поэтому одной попыткой взлома можно не обойтись. В конце стоят точка с запятой и два дефиса, чтобы всё, что идёт после превратилось в комментарий. В результате будет выполнен следующий SQL запрос:
SELECT id, login FROM users WHERE login = “;” OR 1=1 LIMIT 0,1; – and password = hash(“;Some password”)
Он вернет первого пользователя из базы данных и, возможно, залогинится под ним в приложении. Хорошим ходом будет добавить LIMIT, чтобы входить под каждым отдельным пользователем. Это единственное, что нужно, чтобы пройти по каждому значению.
В предыдущем примере всё не так уж страшно. Возможности в админской панели управления всегда имеют ограничения и потребуется реально много работы, чтобы поломать сайт. А вот атака через SQL инъекции может привести к куда большим повреждениям системы. Задумайтесь, сколько приложений создаются с главной таблицей 'users' , и что будет, если злоумышленник введет такой код в незащищённую форму:
My favorite login'; DROP TABLE users; —
Таблица 'users' будет удалена. Это одна из причин почаще делать бэкапы баз данных.
Все параметры, заполненные через форму, передаются на сервер одним из двух методов — GET или POST. Наиболее распространенный параметр, передаваемый через GET — id. Это одно из самых уязвимых мест для атак, при этом неважно, какого вида урл вы используете — «, или «, или «.
Что произойдет, если мы подставим в урл следующий код?
http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE id =1; —
Вероятно, такой запрос вернет нам логин пользователя и… хеш от его пароля. Первая часть запроса `AND 1=0` превращает то, что перед ним в false, соответственно никаких записей не будет получено. А вторая часть запроса вернет данные в виде prepared data. А так как первым параметром идет id, следующим будет логин пользователя и хеш его пароля и еще сколько-то параметров. Существует множество программ, с помощью брутфорса декодирующих такой пароль, как в примере. А так как пользователь может использовать один и тот же пароль для разных сервисов, можно получить доступ и к ним.
И вот что любопытно: от такого способа атаки совершенно невозможно защититься методами вроде `mysql_real_escape_string`, `addslashes` и.т.
д. В принципе, нет способа избежать такой атаки, поэтому, если параметры будут передаваться так:
'SELECT id, login, email, param1 FROM users WHERE id = ' . addslashes($_GET['id']);'
проблемы не исчезнут.
Когда я был новичком в программировании, мне было тяжело работать с кодировками. Я не понимал, в чем между ними различие, зачем использовать UTF-8, когда нужно UTF-16, почему база данных постоянно устанавливает кодировку в latin1. Когда я наконец начал всё это понимать, то обнаружил, что проблем станет меньше, если хранить всё в одном стандарте кодирования.
Разбираясь со всем этим, я заметил также и проблемы безопасности, возникающие при преобразовании из одной кодировки в другую.
Проблем, описанных в большинстве предыдущих примеров, можно избежать, используя одинарные кавычки в запросах. Если вы используете , атаки через SQL-инъекции, построенные на использовании одинарных кавычек, экранируемых обратным слэшем, потерпят неудачу. Но такая атака может пройти, если просто подставить символ с кодом 0xbf27 , преобразует его в символ с кодом 0xbf5c27 – а это вполне валидный символ одинарной кавычки. Другими словами, `뼧` пройдет через , а потом маппинг MySQL конвертирует его в два символа 0xbf (¿) и 0x27 (‘).
"SELECT * FROM users WHERE login = '"; . addslashes($_GET['login']) . ";'";
Этот пример можно хакнуть, передав в поле логина в форме. Движок SQL сгенерит конечный запрос так:
SELECT * FROM users WHERE login = '¿' OR 1=1; —
И вернет первого пользователя из БД.
Как же защитить приложение? Есть куча способов, применение которых не сделает приложение совсем неуязвимым, но хотя бы повысит его защищенность.
Функция ненадежна, так как не предусматривает многие случаи взлома. У mysql_real_escape_string нет таких проблем
Это расширение для MySQL умеет работать со связанными параметрами:
$stmt = $db->prepare('update uets set parameter = ? where id = ?'); $stmt->bind_param('si', $name, $id); $stmt->execute();
Длинный способ подстановки параметров:
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); $stmt = $dbh->prepare('INSERT INTO REGISTRY (name, value) VALUES (:name, :value)'); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // insert one row $name = 'one'; $value = 1; $stmt->execute();
Короткий способ:
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); $stmt = $dbh->prepare('UPDATE people SET name = :new_name WHERE id = :id'); $stmt->execute( array('new_name' => $name, 'id' => $id) );
Используйте ORM и PDO и связывайте (используйте bind) параметры. Избегайте SQL в коде, если вы видите в коде SQL, значит, с ним что-то не так.
ORM позаботится о безопасности в самых узких местах в коде и о валидации параметров.
Цель этой серии не предоставить полное руководство по взлому сайтов, а обеспечить безопасность приложения и предотвращение атак из любого источника. Я постарался написать эту статью не только для программистов — они должны быть в курсе любых угроз в коде и знать пути, как предотвратить их, но также и для инженеров по качеству — потому, что их работа заключается в том, чтобы отследить и сообщить такие моменты.
phpsecuritysql injection
2017-11-02irulПоделиться:
Учебник по SQL написан очень понятным и простым языком и отлично подходит новичкам. Он изобилует пояснительными примерами с подробнейшим объяснением. Изучить язык запросов SQL не составит большого труда, описываются различные версии SQL.
Прежде всего, вы получите представление о реляционных базах данных, узнаете о SQL, который является структурированным языком запросов. Этот специальный язык позволяет создавать и управлять реляционными базами данных, являющихся таблицами, содержащими кластеры связанной информации.
Учебник по SQL позволит научиться свободно оперировать значениями, запросами в базах данных, в т.ч. оперировать переменными с неявными областями значений и связанными подзапросами, выполнять сложные решения. Рассматривается «вложенный SQL»: совмещение SQL с другими языками программирования.
В учебнике вы найдете приложения: по типам SQL данных, синтаксису и командам, нестандартным особенностям языка запросов.
скачать учебник SQL: DepositfilesTurbobit
Эти видеоуроки могут осваивать люди, мало знакомые с программированием, они для новичков. Их цель — научить основам программирования на платформе 1С.
подробнее…
Ускоренное изучение языка запросов 1С на платформе 8.3. Уроки научат извлекать данные из базы в удобном виде, они продуктивны и имеют четкую конкретику.
подробнее…
Видео по Java и объектно-ориентированному программированию. Представлена осязаемая конструкция языка Java и правильная модель программирования.
подробнее…
Любому программисту необходимо уметь работать с базами данных. Вы узнаете, как используются БД и запросы SQL в Java. Уроки подходят новичкам.
подробнее…
Видео по созданию мобильных приложений для Android для абсолютных новичков. Планирование архитектуры будущего приложения с учетом требований рынка.
подробнее…
Учебник по программированию на Java предназначен для новичков, что явствует из его красноречивого названия, он отлично иллюстрирован.
подробнее…
Книга по программированию на языке C, в которой читатель найдет все новшества, необходимые для разработки эффективных и передовых приложений.
подробнее…
Это справочник по эффективному построению карьеры программиста.
Он научит дорого продавать свои услуги на рынке информационных технологий.
подробнее…
Заинтересованному кругу лиц и друзьям:
Язык SQL будет использоваться Вами, какую бы профессию в IT вы не выбрали. Базу данных используют в своей работе разработчики сайтов и приложений, системные администраторы.
Прослушав Курс «Основы SQL» Вы получите универсальные знания о работе с базами данных. Если Вы захотите использовать другие системы управления базами данных (например такие как PostreSQL, Oracle, mySql, Microsoft SQL server и другие) — Вам достаточно будет освоить их специфику. Дополнительные возможности, расширяющие базовый SQL.
На курсе «Основы SQL» Вы научитесь:
На занятиях для изучения языка SQL Вы будете использовать базу данных Posgre SQL, которая является самой мощной из распространяемых по лицензии GPL.
Курс «Основы SQL» необходим для разработчиков приложений, администраторов баз данных, разработчиков отчетов и бизнес-аналитиков. После завершения курса Вы сможете использовать такое мощное средство, как быстрое и эффективное хранилище информации, в своих программах.
Для изучения материала курса никаких начальных знаний в области баз данных не требуется. Если у Вас ранее не было опыта программирования, рекомендуем Вам сначала пройти обучение на «Курсе молодого бойца».
FILED UNDER : IT