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

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

 

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

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

тема: sql - иньекция по числовому параметру
 
 автор: kingarturbig   (07.01.2007 в 19:35)   письмо автору
 
 

Данный пример многим уже известен. Задача состоит в том, чтобы вывести паролья ползователя ( похищение данных ). А втарая часть задания состоит в преобразовании, которое исключило бы от взлома при помощи sql - иньекции.


<?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]<br>";
  if(!empty(
$user['email'])) echo "e-mail - $user[email]<br>";
  if(!empty(
$user['url'])) echo "URL - $user[url]<br>";

?>


Так вот, было привидено много примеро как предотвратить sql - иньекция. Но почему то я не нашел не одного вариатна, где можно было бы, модернизировать данный скрипт с помощью функции addslashes

В моем примере я обрамляю сам параметр кавычками и кавычки в запросе мнемонизирую братным слэшем.

Вот мой пример модернизации


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

?>


Вот таки образом бы выглядел запрос к бд.


"SELECT * FROM userslist  
WHERE id_user = '-1 UNION SELECT 1,pass,2,3,4 FROM userslist WHERE id_user=$_GET[id_user]'  "


Данное поведение является прямым следствием факта, что в случае мнемонизации кавычек в значении некорой переменной ( в нашем случае id_user = '$_GET[id_user]' ) она не быдует содержать немнемонизированную кавычку, а следовательно, и выбраться в этой переменной за пределы строки не получится.

В этом примере уязвимость sql - иньекции отсутствует.

   
 
 автор: Sergey89   (08.01.2007 в 14:36)   письмо автору
 
   для: kingarturbig   (07.01.2007 в 19:35)
 

В данном случае более логичным является не обработка, а проверка входных данных.

   
 
 автор: @ndry   (05.03.2007 в 22:30)   письмо автору
 
   для: kingarturbig   (07.01.2007 в 19:35)
 

Если в айдишнике пользователя передаёться числовой параметр, то можна использовать такой код

 $_GET['id_user'] = (int)  $_GET['id_user'];

он сделает невозможным ввод любых данных кроме цыфр

   
Rambler's Top100
вверх

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