Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 001 на задачу N 11
 
 автор: SoftTime   (06.03.2006 в 15:16)   письмо автору
 
 

Ответ 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

   
 
 автор: cheops   (12.03.2006 в 23:52)   письмо автору
 
   для: 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']);
  }
?>

Приведённый выше код является стандартным и позволяет обходить множество проблем, например, с самого начала на этом форуме использовался предложенный вами вариант - теперь обратный кавычки приходится заменять на прямые, в результате часть кода становится не работоспособной, по иронии судьбы ваш код относится к этой части :)))

   
 
 автор: Atom   (06.07.2006 в 23:26)   письмо автору
 
   для: cheops   (12.03.2006 в 23:52)
 

А разве банальное (int)$_GET[id_user] не поможет?

   
 
 автор: cheops   (06.07.2006 в 23:42)   письмо автору
 
   для: Atom   (06.07.2006 в 23:26)
 

В случае с числом, да, но со строкой лучше применять mysql_escape_string() для экранирования.

   
 
 автор: hell_riser   (08.07.2006 в 19:38)   письмо автору
 
   для: cheops   (06.07.2006 в 23:42)
 

А как на счёт проверки параметра на длинну?
В БД поле id_user INT(11) проверяем чтобы переданый в урле id_user не превышал 11 или даже так можно загнать в урл инъекционый запрос(по моим подсчётам входит только UNION SELEC)
Я не говорю про поля больше чем INT(11)

   
 
 автор: cheops   (09.07.2006 в 09:56)   письмо автору
 
   для: hell_riser   (08.07.2006 в 19:38)
 

Да проще проверить его на is_integer() или действительно привести к целому числу - любая строка, которая будет не числом будет приведена к 0.

   
Rambler's Top100
вверх

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