Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Защита от инжектиране на SQL код в PHP приложения
  1. Какво е SQL инжекция
  2. Как да се предпазим от SQL инжекция
     
Автор  plamenSm (14.04.2008 14:37)  съобщение до автора
Погледнат  2240 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за PHP
    Страница 1 / 2

 



В днешни дни всеки от нас малко или много е засегнат от развитието на информационните технологии. Пазаруване, банкови операции, дори социални контакти... Дори и да не искаме, наши лични данни се пазят в електронен вид в най- различни бази данни на държавни институции, банки, сайтове за електронни разплащания и др. В този смисъл предпазването на тези данни от злонамерено придобиване и използване и в България е уредено със закон (ЗАКОН за защита на личните данни. Обнародван в ДВ, бр. 1 от 4.01.2002 г), но друг е въпросът за техническата страна на надеждността на информационните системи.

В този урок ще разгледаме един от най-„популярните” начини за нерегламентиран достъп до данни и съответно начините за предпазване от него. Става въпрос за вкарването и изпълнението на SQL код в база данни през полета на входни формуляри (html форми). Или така наречените SQL инжекции.


Какво е SQL инжекция?

Най-лесно това може да се обясни с един малък пример. Нека да разиграем един сценарий: Боб е програмист на свободна практика, нает от банка за разработване на система за електронни разплащания с кредитни карти. Като част от системата, Боб създава следната таблица в базата данни (примера е с MySQL):

CODE
1
2
3
4
5
6
7
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(200) NOT NULL,
`password` varchar(200) NOT NULL,
`creditcard` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
)
;

След което зарежда съществуваща информация в таблицата:

CODE
1
2
3
4
5
6
INSERT INTO `users`
(`id`, `username`, `password`, `creditcard`)
VALUES
(1, 'Sidewinder', 'monkey', '0123456789987654'),
(2, 'John', 'password!', '3123456769384659'),
(3, 'Jerry', '1234', '7133116752374638');

Тук менажера на проекта би трябвало да забележи една нередност - паролите никога не трябва да се пазят в явен вид! Обикновено те се записват еднопосочно криптирани (например като MD5 хеш). Както и да е, това е друга тема. Боб продължава с login формуляр за системата:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
if(empty($_GET['username'])) {
   
echo "<form method='GET' action='login.php'>"
      .
"Username: <input type='text' name='username' /><br />"
      .
"Password: <input type='text' name='password' /><br />"
      .
"<input type='submit' value='Login' />"
      .
"</form>";
}

if(get_magic_quotes_gpc()) {
   
$username = stripslashes($_GET['username']);
   
$password = stripslashes($_GET['password']);
}

$link = mysql_connect($dbhost, $dbuser, $dbpass)
   
or die('Could not connect: ' . mysql_error());

mysql_select_db($mysqldb, $link)
   
or die('Could not select database.');

$query = mysql_query("SELECT * FROM `users` "
      .
"WHERE `username` = '$username' "
      .
"AND `password` = '$password'")
 
or die('Could not select database.');

$row = mysql_fetch_assoc($query);

if(mysql_num_rows($query) >= 1) {
 
echo "Hello {$row['username']}!<br />";
 
echo "Your credit card number is: {$row['creditcard']}.";
}
?>

И така Боб е изпълнил изискването на проект-менажера: Потребителя въвежда име и парола, и ако те са коректни вижда съобщението:

Hello [име-на-потребителя]!
Your credit card number is: [номер-на-картата].

Боб е свършил възложеното му. Получава си парите за свършената работа и доволен продължава с друга работа ....

Ето как комбинацията от недоглеждане на менажера и незнанието на Боб позволяват на хакера X да заобиколи защитата и да види номера на поне една кредитна карта.

Веднага се вижда, че е използван метод GET вместо по-сигурния POST, което улеснява още повече хакер X. Поглеждайки html кода на страницата за login, X забелязва този факт и просто в полето за адрес на своя браузър записва:


CODE
1
http://.../login.php?username=anything&password=anything'%20OR%201='1

И вижда следното:

Hello Sidewinder!
Your creditcard number is: 0123456789987654.

Как се получи това? - „Инжектирания” код:

CODE
1
anything' or 1='1

променя SQL заявката така:

CODE
1
2
3
4
SELECT * FROM `users`
WHERE `username` = 'anything'
AND `password` = 'anything'
OR 1='1'

Вижда се, че условието във WHERE ще бъде винаги изпълнено за всички редове. Тук логиката на скрипта ограничава изхода до първия ред от таблицата, но сами се сещате, че с добавяне на малко програмиране може да се извлече цялата таблица. За да не се превръща урока в ръководство за хакери, ще спра до тук.



  Следваща страница >> 


Ключови думи: php SQL инжекция XSS SQL инжектиране на SQL


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008