Главная страница IT-студия  
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создание сайтов. Авторы: Кузнецов М.В., Симдянов И.В. Головоломки на PHP для хакера (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры . Авторы: Кузнецов М.В., Симдянов И.В. PHP. Народные советы. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование: ступени карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Security & Cracking Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
Консультации от известных специалистов и авторов многих книг

Информационный портал
«SoftTime-INFO»




| Задачи | 11. SQL-инъекция (06.03.06)

11. SQL-инъекция (06.03.06)

Автор - Симдянов Игорь (cheops)
Категория задачи - 1.

Пусть имеется список зарегестрированных пользователей в базе данных MySQL. Для этого используется таблица вида:

CREATE TABLE userslist (
  id_user int(11) NOT NULL auto_increment,
  name tinytext NOT NULL,
  pass tinytext NOT NULL,
  email tinytext NOT NULL,
  url tinytext NOT NULL,
  PRIMARY KEY  (id_user)
) TYPE=MyISAM;
INSERT INTO userslist VALUES (1, 'cheops', 'cheops', 'cheops@mail.ru', 'http://www.softtime.ru');
INSERT INTO userslist VALUES (2, 'barton', 'dwert', 'barton@mail.ru', '');
INSERT INTO userslist VALUES (3, 'Gordon', '123', '', '');
INSERT INTO userslist VALUES (4, 'tester', 'test', '', '');
INSERT INTO userslist VALUES (5, 'Чиф', 'gfhjkm', 'kuznetsov@softtime.ru', 'http://www.softtime.ru');
INSERT INTO userslist VALUES (6, 'yandex', 'zyltrc', 'yandex@mail.ru', 'http://www.yandex.ru');

Скрипт, представленный ниже, выводит список зарегистрированных пользователей.

<?php
  
// Устанавливаем соединение с базой данных
  
require_once("config.php"); 
  
// Запрашиваем список всех пользователей
  
$query "SELECT * FROM userslist ORDER BY name";
  
$usr mysql_query($query);
  if(!
$usr) exit("Ошибка - ".mysql_error());
  while(
$user mysql_fetch_array($usr))
  {
    echo 
"<a href=user.php?id_user=$user[id_user]>$user[name]</a>";
  }
?>

Каждое имя пользователя является гиперссылкой вида <a href=user.php?id_user=1>имя</a>, которая ведёт на страницу с более подробной информацией о пользователе user.php:

<?php
  
// Устанавливаем соединение с базой данных
  
require_once("config.php"); 
  
// Запрашиваем список всех пользователей
  
$query "SELECT * FROM userslist WHERE id_user = $_GET[id_user]";
  
$usr mysql_query($query);
  if(!
$usr) exit("Ошибка - ".mysql_error());
  
$user mysql_fetch_array($usr);
  echo 
"Имя пользователя - $user[name]";
  if(!empty(
$user['email'])) echo "e-mail - $user[email]";
  if(!empty(
$user['url'])) echo "URL - $user[url]";
?>

Составьте две SQL-инъекции, первая из которых будет выводить пароль пользователя, вторая - версию MySQL-сервера. Исправьте файл user.php таким образом, чтобы SQL-инъекции были не допустимы.

Для работы потребуется файл config.php, который устанавливает соединение с базой данных. Ниже приводится универсальный конфигурационный файл для работы с MySQL 4.0-5.1:

<?php
  
///////////////////////////////////////////////////
  // 2006 (C) IT-студия SoftTime (http://www.softtime.ru)
  ///////////////////////////////////////////////////
  // Cейчас выставлен сервер локальной машины
  
$dblocation "localhost";
  
// Имя базы данных, на хостинге или локальной машине
  
$dbname "bd";
  
// Имя пользователя базы данных
  
$dbuser "root";
  
// и его пароль
  
$dbpasswd "";

  
// Устанавливаем соединение с базой данных
  
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
  if (!
$dbcnx) {
   exit( 
"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
  }
  
// Выбираем базу данных
  
if (! @mysql_select_db($dbname,$dbcnx) ) {
    exit( 
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
  }

  
// Определяем версию сервера
  
$query "SELECT VERSION()";
  
$ver mysql_query($query);
  if(!
$ver) exit("Ошибка при определении версии MySQL-сервера");
  
$version mysql_result($ver0);
  list(
$major$minor) = explode("."$version);
  
// Если версия выше 4.1 сообщаем серверу, что будем работать с
  // кодировкой cp1251
  
if($major >= && $minor >= 1)
  {
    
mysql_query ("set character_set_client='cp1251'"); 
    
mysql_query ("set character_set_results='cp1251'"); 
    
mysql_query ("set collation_connection='cp1251_general_ci'");
  }
?>

С ответами и обсуждением можно ознакомиться в темах по ссылкам
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14373
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14374
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14375
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14376
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14377

Русская версия English

 
  Rambler's Top100 Яндекс.Метрика Яндекс цитирования