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

Форум MySQL

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

 

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

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

тема: mysql_escape_string
 
 автор: Shorr Kan   (09.10.2006 в 02:16)   письмо автору
 
 

То ли мне кажется, то ли где-то я читал, то переменная экранирована при помощи этой функции правильно только в том случае, если в запросе эта переменная будет в одинарных или обратных кавычках. Если же наподобие:

SELECT * FROM a ORDER BY $order

то mysql_escape_string не поможет, если что не так в $order

Так ли это? Или же и в этом случае mysql_escape_string удачно выполняет свою задачу?

   
 
 автор: Trianon   (09.10.2006 в 12:56)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 02:16)
 

А какая, Вы полагаете, у этой функции задача?

Так или иначе, для Вашего случая она совершенно бесполезна.

   
 
 автор: cheops   (09.10.2006 в 14:04)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 02:16)
 

Хм... не очень понятно, что хотите сделать при помощи этой функции?

   
 
 автор: Unkind™   (09.10.2006 в 15:38)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 02:16)
 

Функция mysql_escape_string() помогает в таких случаях, например:


<?php
include("config.php");

$sql mysql_query("UPDATE `table` SET `var` = '".mysql_escape_string($var)."' WHERE `id` = '".intval($_GET['id'])."';"); 
?>


Если бы вместо обычного значения $var было что-то вроде 123', `admin` = '1, то можно изменить о себе любую информацию, зная имена столбцов.

   
 
 автор: Shorr Kan   (09.10.2006 в 17:31)   письмо автору
 
   для: Unkind™   (09.10.2006 в 15:38)
 

Ладно, видимо я не тот пример привел.

Если $var - цифра, то в запросе можно не ставить одинарные кавычки вокруг переменной.


<?
// уязвимость
$var=$_GET['var'];
mysql_query("UPDATE tbl SET stolb=$var;");
?>




<?
// нет уязвимости
$var=mysql_escape_string($_GET['var']);
mysql_query("UPDATE tbl SET stolb='$var';");
?>




<?
// есть ли уязвимость?
$var=mysql_escape_string($_GET['var']);
mysql_query("UPDATE tbl SET stolb=$var;");
?>

   
 
 автор: Unkind™   (09.10.2006 в 18:22)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 17:31)
 

Если $var - цифра, то Вам вообще лучше написать что-то вроде


<?php
$var 
= (int) $_GET['var'];
//Или
$var intval($_GET['var']);
?>


есть ли уязвимость?
Можно подставить 1, admin = 1 И опять я должен стать админом.

   
 
 автор: Shorr Kan   (09.10.2006 в 18:50)   письмо автору
 
   для: Unkind™   (09.10.2006 в 18:22)
 

Вы меня поняли слишком буквально... весь мой вопрос состоит лишь в том - действует ли mysql_escape_string так же, будучи без кавычек, как если бы использовалась с кавычками...

$var=mysql_escape_string($_GET['var']);
mysql_query("SELECT * FROM tbl WHERE stolb='$var';");
mysql_query("SELECT * FROM tbl WHERE stolb=$var;");

аналогично ли действие mysql_escape_string для этих двух mysql_query ?

Вот каков мой вопрос... всего лишь...

   
 
 автор: Trianon   (09.10.2006 в 18:33)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 17:31)
 

Кавычки ставятся не вокруг переменной, а вокруг текстового значения, тем самым образуя текстовый литерал. Вот в этом самом текстовом значении некторые символы должны (в случае их присутствия) быть экранированы символом 'обратный слэш'.
Функция mysql_escape_string предназначена именно для преобразования текста в литерал, а не для защиты от уязвимости.
Защита от уязвимости - её побочный эффект.
Точнее даже так: Сама по себе уязвимость "sql-injection через текстовый литерал" есть не что иное как следствие некорректного формирования литерала, и в правильно сформированном запросе просто невозможна.
Эта функция никак не сможет помочь во всех других случаях динамического построения запроса. В частности, когда в запрос передаются числа, имена полей, таблиц, и пр.

   
 
 автор: Shorr Kan   (09.10.2006 в 18:44)   письмо автору
 
   для: Trianon   (09.10.2006 в 18:33)
 

Если в числовое поле (при НЕ использовании кавычек) передать кавычку для sql-injection - поможет ли Mysql_escape_string в этом случае? Пусть даже и побочным эффектом. Если окружать числовое значение кавычками - поможет. Но если не окружать - поможет?

   
 
 автор: Trianon   (09.10.2006 в 19:19)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 18:44)
 

>Если в числовое поле (при НЕ использовании кавычек) передать кавычку для sql-injection - поможет ли Mysql_escape_string в этом случае? Пусть даже и побочным эффектом.

Нет, не поможет. Никаким.

Если окружать числовое значение кавычками - поможет.
Если окружать числовое значение кавычками - числовое значение станет текстовым. И к нему можно будет применить все предыдущие рассуждения. То, что в контексте числовых полей сервер сам потом преобразует текстовое поле с числовым содержимым в число, вопрос пятнадцатый. Тем более, что не всякий сервер преобразует.

Но если не окружать - поможет?
нет.

   
 
 автор: Shorr Kan   (09.10.2006 в 19:38)   письмо автору
 
   для: Trianon   (09.10.2006 в 19:19)
 

Значит, при использовании

SELECT * FROM tbl WHERE $where

sql-инъекция - возможна? $where формируется исходя из всяких событий, связанных с get-параметрами.

Примерно так формируется:

<?
$where
='';
if(isset(
$_GET['param'])){$where="param='".mysql_escape_string($_GET['param'])."'";}
?>

   
 
 автор: Trianon   (09.10.2006 в 19:48)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 19:38)
 

В таком варианте - невозможна. Поскольку $where не читается из входных параметров, а формируется из постоянной части "where=" и литерала (причем для создания значения последнего применяется mysql_escape_string.) И формируется корректно при любых значениях входных параметров.

   
 
 автор: Shorr Kan   (10.10.2006 в 07:35)   письмо автору
 
   для: Trianon   (09.10.2006 в 19:48)
 

Можете привести пример(ы) некорректного формирования (с ипользованием mysql_escape_string) той или иной переменной, использующейся в каком-либо запросе?

   
 
 автор: Trianon   (10.10.2006 в 16:39)   письмо автору
 
   для: Shorr Kan   (10.10.2006 в 07:35)
 

Пожалуйста:
$name = "O'Relly";
$column = "company";
$filter = mysql_escape_string("$column = '$name'");
$sql = "SELECT * FROM tab WHERE $filter".

   
 
 автор: Shorr Kan   (11.10.2006 в 00:23)   письмо автору
 
   для: Trianon   (10.10.2006 в 16:39)
 

Ага... спасибо

   
Rambler's Top100
вверх

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