Защита от SQL-инъекций PHP
0

Защита от SQL-инъекций PHP

Совсем недавно меня попросил один человек рассказать про SQL - инъекции и способы защиты от них на PHP. Собственно руки дотянулись и данная статья специально по этому запросу. Речь пойдет о способах защиты, но кроме этого я также расскажу побольше теории и как всё бывает на деле.

Давайте начнем с самого определения. SQL-инъекция, что же это. А это один из самых популярных и опасных способов взлома вашего сайта. Используя инъекции такого типа хакер может вставить какой угодно SQL-код в ваш запрос. А это в свою очередь не есть хорошо, я бы сказал даже опасно. 

 

Предположим, что у нас есть такой вот безобидный даже запрос:

SELECT*FR0M subscribers WHERE id = '$id'

Он работает очень хорошо, и выводит нам какие-то данные, пусть это будут данные о подписчиках. Все прекрасно и сказочно, казалось бы, но что будет, если вместо переменной "$id" вставить не число (как должно быть), а какой-то код, например такой:

1;DELETE FROM subscribers;

Эта строчка попадет в ваш запрос и он при этом будет работать, что может вызвать у вас проблемы. Например при этом запросе все ваши подписчики уничтожатся.

Так вот, защита от всей этой пакасти достаточно проста для вашего понимания, но и сложная в тоже время, она требует того, чтобы вы ее использовали всегда. Здесь будет уместно следующее правило: если в каком-то SQL запросе вы пользуетесь переменными, а их значение вы вытаскиваете от пользователя, то никогда не добавляйте переменные напрямую в запрос! Лучше воспользуйтесь следующими способами написания кода в таких случаях.

 

1. Приравняйте переменную к вашему запросу, то есть добавьте ваш запрос в переменную:

$t = “SELECT*FR0M subscribers WHERE id = '$id';

 

2. На смену переменной $id, которая стоит в запросе вы можете добавить следующие служебные символы: %s – для строки; %d – для целого числа; %f – для действительного числа. Получится запрос такого типа:

$t = “SELECT*FR0M subscribers WHERE id = '%d';

 

3. Воспользуйтесь функцией sprintf(). Эта функция умеет возвращать чистую отформатированную строку. Более подробную информацию о ней, вы можете найти в справочнике PHP. Тут запомните одну суть, как первый параметр нужно указывать переменную, в которую вставлен специально сделанный нами запрос. А в качестве всех других, можете указать те что вам хочется вытянуть (например те, вместо которых мы вставляли спец. символы). И еще одно, все переменные должны вставляться в топ порядке, в котором обязаны быть вставлены в запрос. Вот так на выходе будет смотреться ваш код:

$t = "SELECT * FROM subscribers WHERE id = '%d'";
$query = sprintf($t, $id);

 

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

$t = "SELECT * FROM subscribers WHERE id = '%s'";
$query = sprintf($t, mysql_real_escape_string($string));

Теперь ваши запросы ($query) вы можете отправлять совершенно безопасно, не беспокоясь о своем сайта и базе данных, так они в безопасности будут.

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

 

Проверка типа (принудительная установка типа) данных:

$name = (int)$_GET["id"]; // если нужно целое число
$name = (float)$_GET["id"]; // если нужно число с плавающей точкой
 
// или:
$name = settype($_GET["id"],"integer"); // если нужно целое число
$name = settype($_GET["id"],"float"); // если нужно число с плавающей точкой
 
// или сразу сдлать отформатированную строку запроса через sprintf() как мы разбирали ранее:
$query = sprintf("SELECT * FROM `subscribers` WHERE `name` = %d;",$name); // если требуется целое число
$query = sprintf("SELECT * FROM `subscribers` WHERE `name` = %f;",$name); // если требуется число с плавающей точкой

В этом примере, будет работать по такому принципу всё. Если в передаваемой переменной после числа стоит какой-либо символ (например какая-то кавычка), к примеру 97’ или 97”, или 97abc - то выведется только одно число, а остальные знаки будут не восприняты PHP.

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

Запись опубликована В категории: Изучение PHP

Shnapik

Вебмастер с опытом ищет приют! Возьмите меня, а то меня рвут!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *