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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: mysql_escape_string

Сообщения:  [1-10]   [11-15] 

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

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

   
 
 автор: 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   (10.10.2006 в 07:35)   письмо автору
 
   для: Trianon   (09.10.2006 в 19:48)
 

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

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

В таком варианте - невозможна. Поскольку $where не читается из входных параметров, а формируется из постоянной части "where=" и литерала (причем для создания значения последнего применяется 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:19)   письмо автору
 
   для: Shorr Kan   (09.10.2006 в 18:44)
 

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

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

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

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

   
 
 автор: 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 ?

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

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

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

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

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

   
 
 автор: 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 И опять я должен стать админом.

   

Сообщения:  [1-10]   [11-15] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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