Блог web-разработчика | HTML+CSS, PHP, MySQL, JavaScript

Март/10

27

Немного о SQL-инъекциях

SQL-иньекция
Современный web-сервисы все чаще используют реляционные базы данных для хранения информации. С каждым днем эти базы пополняются различного рода информацией: от простейших общедоступных комментариев до различного рода секретной информации, в связи с этим жестко встает вопрос о защите информации от посторонних глаз. Одним из самых распространнех способов взлома баз данных являются SQL-инъекции (SQL-injection).

В этой статье Я расскажу немного о SQL-инъекциях и о основных способах защиты от подобного рода взломов.

Принцип атаки

Предположим, что сервер получает параметр id от пользователя и использует его для создания SQL-запроса:

1
2
3
4
...
$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news = $id");
...

К примеру, если на сервер передан id=1, то запрос будет:

1
SELECT * FROM news WHERE id = 1

“Выбрать всё из таблицы news где id=1″, то есть будет выбрана новость с id=1. И вот тут начинается самое интересное…
Если вместо числа в параметр id передать строку вида “-1 OR 1=1″, то наш запрос будет выглядить так:

1
SELECT * FROM news WHERE id = -1 OR 1=1

Наш запрос стал таким: “выбрать всё из таблицы news где id=-1 или 1=1″, поскольку единица всегда равна единице (1=1), то будет выбрана не одна новость с определенным id, а вся таблица news.
Таким образом SQL-инъекции основываются на передачи в качестве параметров конструкции SQL, тем самым нарушаю стандартную логику запроса.

Обработка входных параметров

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

Некоторые правила

Всегда проверяйте соответствует ли полученная от пользователя информация той, которую Вы хотели получить от него.
1) Проверяйте, тот ли тип данных передается, который нужен в запросе. Допустим пользователь вводит в форму свой возраст в целочисленном формате. В этом случае необходимо проверить действительно ли пользователь передал число, а не строку?

1
2
3
4
5
6
7
8
<?php
    if(is_numeric($_GET['vozrast'])){
    // Пользователь не злоумышленник :)
    }
    else{
        echo('Ошибка ввода! Данные вводяться исключительно цифрами!')
    }
?>

2) Ограничивайте длину принимаемых данных, там где это возможно. Возвращаясь к примеру с возрастом, можно обойтись длинной в три символа (не всякий до 100 лет доживает, но случаи бывали).

1
2
3
4
5
6
<?php
...
// Урезаем длину переменной $age до 3-х символов
$age=substr($_REQUEST['age'], 0, 3)
...
?>

3) Экранируйте все спецсимволы в строковых параметрах.

1
2
3
4
5
<?php
...
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($user)."';";
...
?>

Послесловие

О безопасностности стоит задумываться в самом начале разработки, на этапе проектирования. Не стоит откладывать вопрос безопасности “на потом”, так как такой подход вместе с изменениями может внести кучу ошибок и даже поставить о вопрос о разработке нового “безопасного” проекта. При нахождении малейшей уязвимости, пусть даже её вероятность чрезвычайно мала, не стоит думать “обойдеться”, лучше потратить время на устранение уязвимости, чем потом желеть о утечке/потере данных.

RSS Feed

Еще нет комментариев.

Написать комментарий

«

»

Найти!

Дизайн devolux

Публикация материлов с сайта только с указанием активной ссылки на источник. web4develop.ru. 2010 год.


Warning: include(urls2.txt) [function.include]: failed to open stream: No such file or directory in /home/rubinru/public_html/web4develop.ru/index.php on line 21

Warning: include(urls2.txt) [function.include]: failed to open stream: No such file or directory in /home/rubinru/public_html/web4develop.ru/index.php on line 21

Warning: include() [function.include]: Failed opening 'urls2.txt' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/rubinru/public_html/web4develop.ru/index.php on line 21

Warning: include(urls3.txt) [function.include]: failed to open stream: No such file or directory in /home/rubinru/public_html/web4develop.ru/index.php on line 22

Warning: include(urls3.txt) [function.include]: failed to open stream: No such file or directory in /home/rubinru/public_html/web4develop.ru/index.php on line 22

Warning: include() [function.include]: Failed opening 'urls3.txt' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/rubinru/public_html/web4develop.ru/index.php on line 22