Post_80aОдна из самых широких проблем безопасности веб приложений, называется SQL Injection (внедрение SQL-кода).  Внедрение SQL-кода, название говорит само за себя, это способ взлома сайтов, и програм работающих с базами данных, основанных на внедрении в запрос (querry) произвольного SQL-кода.

Внедрение SQL-кода состоит в том, что злоумышленник может выполнить запрос к базе данных (например добавить данные, стереть таблицу), получить доступ к некоторым локальным файлам, на том сервере на который осуществляется атака.

Вероятность такой атаки высокая, в случае некоретной обработки входных данных, которые используют в SQL-запросах.

В общем и целом SQL Injection необходимо понимать как уязвимисть системы безопасности, через которую нападающий может ввести различные данные, или команды в РНР страницу.

Для того чтобы лучше понять понятие и результат SQL Injection можно взять в качестве примера очень часто случающуюся ситуацию. Мы часто сталкиваемся с проверкой подлинности веб приложений. Например: по электронной почте. В данном случае пользователю необходимо ввести имя пользователя, и пароль. Что происходит после того как мы вводим данные, и нажимаем «Ок».  

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

Допустим у нас есть веб-страница с входом (login), которая предоставляет пользователю текстовое поле для «пользователя» (User), а также поле для «пароля» (Password). Когда пользователь заполняет эти поля и нажимает кнопку «Ок» тогда страница по умолчанию использует скрипт РНР, который автоматически заполняется информацией, представленной пользователем. Этот скрипт создает запрос SQL и работает с базой данных.

Например: Запрос может быть в форме

strSQL = «SELECT» * FROM t_User «& _

«Where username = ‘» & «‘ AND Password = ‘» & Password & «‘»

ИЛИ

strSQL = «SELECT» * FROM t_User «& _

«Where username = ‘» & UserName & «‘ 

and password = ‘ «& Password &»‘ »

Хакер может использовать этот скрипт, введя в поле «Username» следующую команду

‘OR 1 = 1 —

Результатом будет:

Where username = » OR 1 = 1 — and password = ‘WHATEVER’

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

Как защитить скрипты от SQL Injection

Поскольку когда становится понятно, что такое SQL Injection, тогда очень важно также узнать как можно защититься от такого рода безопасности.

К счастью защититься от SQL Injection не сложно, а наоборот очень просто. Необходимо разрешить действовать только одной опции для создания защищенного запроса. Все также зависит и от типа используемого РНР-расширения. Большинство используют расширение «mysql»

Расширение РНР представляет собой динамические библиотеки (наборы подпрограмм и объектов). Расширение позволяет дополнять базовые возможности языка, обеспечить работу с базами данных, динамичной графикой, криптографическими библиотеками, документами формата PDF.

Чаще всего для защиты от SQL Injection специалисты используют функцию mysql_real_escape_string (). которая заменяет специальные символы в unescaped_string беря за внимание кодирования соединения таким образом, что результат можно безопасно использовать в SQL-запросе в функции mysql_query ().

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

пример:

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

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

Функция mysql_real_escape_string () используется для экранирования служебных символов, установленный перед ними слеш (для экранирования используют и другие символы)   mysql_real_escape_string () вызывает библиотечную функцию  MySQL mysql_real_escape_string , которая добавляет обратную косую черту к следующим символов: \ x00; \ n; \ r; \; «,» And \ xla

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

Пример mysql_real_escape_string () к каждой переменной, которая вставляется в запрос, предотвращает SQL Injection.

Код ниже является лучшим вариантом составления запросов.

<? PHP

// Функция экранирование переменных

function quote_smart ($ value)

{

// Если magic_quotes_gpe включена — используем stripslashes

если (get_magic_quotes_gpe ()) {

$ Значение = stripslashes ($ значение);

}

// Если переменная — число тогда экранировать не нужно

// Если нет — тогда берем переменную в скобки и экранируют

if (! is_numeric ($ value)) { 

$ value = «» .mysql_real_escape_string ($value). «»;

}

return $ value

}

// Зеднуемся

$ linc = mycql_conect ( ‘MYSQL_HOST’, ‘mysql_user’, ‘mysql_password’)

or die (mysql_error ());

// Составляем безопасный запросы

$ query = sprint ( «SELECT * FROM users WHERE user=%s AND password=%»;

qute_smart ($ _POST [ ‘username’]),

qute_smart ($ _POST [ ‘password’]);

mysql_query ($ query);

?>

 

Внимание код ниже для того чтобы скопировать, открыть текстовый редактор и поместить код в документ, хранится код с расширением .php [/ stextbox]

<?PHP
// Функція екранування змінних

function quote_smart($value)

{

// Якщо magic_quotes_gpe включена — використовуємо stripslashes

if (get_magic_quotes_gpe()) {

$ value = stripslashes($ value);

}

// Якщо змінна — число тоді екранувати не потрібно

// Якщо ні — тоді берем змінну в дужки і екрануємо

if (!is_numeric($value)) { 

$ value = "" .mysql_real_escape_string($ value) . "";

}

return $ value

}

// Зєднуємся

$linc = mycql_conect('mysql_host','mysql_user','mysql_password')

OR die(mysql_erro());

// Складаємо безпечний запити

$query = sprint("SELECT * FROM users WHERE user=%s AND password=%";

qute_smart ($_POST['username']),

qute_smart ($_POST['password']);

mysql_query($query);
?>

Еще несколько правил безопасности.

⇒ НЕ открывайте соединения с базой, используя учетную запись владельца или администратора. Всегда старайтесь использовать спецальностворених пользователей с максимально ограниченными правами.

⇒ обязательно  проверяйте введенные данные на соответствие ожидаемого типа. В РНР существует много функций для проверки данных.

⇒ в случае если приложение ожидает цифровое введение, примените функцию is_numeric () для провирки введенных данных или вынуждены укажите их тип с помощью settype () или же просто используйте числовое представление при помощи функции sprintf ();

⇒ экранируйте любое нецифровой ввода, используемый в запросах к базе данных.

⇒ не выводите никакой информации в базе данных, особенно о ее структуре.

⇒ качественно используйте информацию, которая содержится в лог-файле. Логирования (внесение в журнал событий) может допомоготы при трассировке взломана приложения.