| Задачи | 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($ver, 0);
list($major, $minor) = explode(".", $version);
// Если версия выше 4.1 сообщаем серверу, что будем работать с
// кодировкой cp1251
if($major >= 4 && $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
|