Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (SQL) проверка введенных данных (защита) / 14 сообщений из 14, страница 1 из 1
19.10.2005, 15:20
    #33333320
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Здравствуйте!
На PHP есть упрощенный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
..................
$Id = $_POST['var1'];

$str=mysql_escape_string('DELETE FROM table WHERE Id=' . $Id);

$R=@mysql_query($str);
..................
Вопрос:
Достаточно ли использовать функцию mysql_escape_string, или необходимо делать еще какие-то проверки?
Заранее спасибо!
...
Рейтинг: 0 / 0
19.10.2005, 15:46
    #33333402
Dmitri P.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Функцию mysql_escape_string необходимо применять к значениям полей, и желательно эти значения заключать в кавычки(одинарные или двойные)
Я бы сделал так:
Код: plaintext
1.
$str="DELETE FROM table WHERE Id='" . mysql_escape_string($Id) . "';");
...
Рейтинг: 0 / 0
19.10.2005, 15:53
    #33333427
Dmitri P.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Сорри, на вотрос так и не ответил...

В приведенном табой примере, я могу отправить строку "1 OR 1=1"
После выполнения кода получится запрос:
Код: plaintext
DELETE FROM table WHERE Id= 1  OR  1 = 1 
который снесет все данные.

При использовании кавычек получим запрос:
Код: plaintext
DELETE FROM table WHERE Id='1 OR 1=1'
т.к. записи с идентификатором "1 OR 1=1" нет ничего страшного не произойдет.

Ну, думаю, более менее понятно :)
...
Рейтинг: 0 / 0
19.10.2005, 15:57
    #33333440
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
т.е. достаточно добавить кавычки?
а нет ли такой функции, которая бы отсекала служебные слова или символы, или того, что Вы привели достаточно?
...
Рейтинг: 0 / 0
19.10.2005, 16:04
    #33333461
Dmitri P.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Baginт.е. достаточно добавить кавычки?
Смотря по ситуации.
Как правило, добавление кавычек решает проблему. Я еще ниразу не сталкивался с тем, чтобы это не помогло :)

Baginа нет ли такой функции, которая бы отсекала служебные слова или символы
Насколько я знаю, стандартных функций нет...

Так, небольшое добавление, если априорно известно, что ID - целое число,лучше сделать $Id = intval($_POST['var1']);
...
Рейтинг: 0 / 0
19.10.2005, 16:19
    #33333508
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Dmitri P.Так, небольшое добавление, если априорно известно, что ID - целое число,лучше сделать $Id = intval($_POST['var1']);Это-то понятно, на самом деле у меня так и прописано, но если придется использовать строковые поля, например,
'DELETE FROM table WHERE ProductName="' . $ProductName . '"' ?

$ProductName='Name" OR 1=1 --'
Тогда строка запроса будет такой:
'DELETE FROM table WHERE ProductName="Name" OR 1=1'
и mysql_escape_string() может не помочь.
...
Рейтинг: 0 / 0
19.10.2005, 16:30
    #33333539
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
я вот когда последний раз тот гандурас под названием PHP пинал писал примерно такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
//
//
//---------------------------------------------
function db_query($string, $Connect, $params = array() )
{
    //  выполнение запросов к базе
    //  $string - SQL запрос

    if ( isset($params) )
    {
        $q = '';
        $p = explode("?", $string);
        $c = count($p);
        for($i= 0 ;$i<$c- 1 ;$i++)
        {
            if ( is_string($params[$i]) )
            {
                $q .= $p[$i] . ( ($params[$i] === null) ? 'NULL' : "'".str_replace("'", "''", $params[$i])."'" );
            }
            else
            {
                $q .= $p[$i] . $params[$i];
            }
        }
        $string = $q . $p[$c- 1 ];
    }
    $result = sybase_query($string, $Connect);

    if (!$result)
    {
        $num_err= 103 ;
        $error="Query error";
        ErrorLog($num_err, "$error :" . sybase_get_last_message() );
        die($error);
    }

    return ( $result );
}

и дергал его примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
   {
        $sql="exec IPCallEventLstBySubscriber @AccountID=?, @From=?, @To=?, @ID=?";
        $buf = get_rows(db_query(   $sql,
                                    $Connect,
                                    array(  0 +$cardid, $fdata, $ldata,  0 +$s[SubscriberID] ) ) );
    }
...
Рейтинг: 0 / 0
19.10.2005, 16:33
    #33333550
Dmitri P.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Код: plaintext
1.
2.
$ProductName='Name" OR 1=1 --';
$str = 'DELETE FROM table WHERE ProductName="' . mysql_escape_string($ProductName) . '"';
даст такой запрос:
Код: plaintext
1.
DELETE FROM table WHERE ProductName="Name\" OR  1 = 1  --"

Будет предпринята попытка снести продукт с именем 'Name" OR 1=1 --', а не все данные.
...
Рейтинг: 0 / 0
19.10.2005, 16:42
    #33333574
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Спасибо всем за помощь! буду пробовать.
...
Рейтинг: 0 / 0
19.10.2005, 16:57
    #33333623
1024byte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
http://www.zone-h.org/files/42/SQLInjectionPasswd.txt
вот для примера что чаще всего используют для sql-injection
я бы посоветовал маскировать все кавычки
проверял на наличие только допустимых символов
и (если задача позволяет) выкидывал все лексемы SQL
and or union substring и пр.

или кодировать полученое и хранить данные тоже в закодированом виде
например запрос
DELETE FROM table WHERE ProductName="%D0%AB%D0%B2%D0%B0%D0%BF%D1%8B%D0%B2%D0"; врядли приведет к неожиданым последствиям
...
Рейтинг: 0 / 0
19.10.2005, 22:37
    #33334059
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Что-то вы тут навыдумывали...
id -- это же число тут?
Ну так и говорим, что
$Id = intval($_POST['var1']);
Другое дело, что с помощью этого скрипта можно удалить любой элемент из таблицы, но это никаким экранированием не исправишь.
...
Рейтинг: 0 / 0
20.10.2005, 09:18
    #33334297
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
DocAlЧто-то вы тут навыдумывали...
id -- это же число тут?
Ну так и говорим, что
$Id = intval($_POST['var1']);
Другое дело, что с помощью этого скрипта можно удалить любой элемент из таблицы, но это никаким экранированием не исправишь.
Это уже понятно, тут уже обсуждается, если параметром должна быть строка:
Bagin Dmitri P.Так, небольшое добавление, если априорно известно, что ID - целое число,лучше сделать $Id = intval($_POST['var1']);Это-то понятно, на самом деле у меня так и прописано, но если придется использовать строковые поля, например,
'DELETE FROM table WHERE ProductName="' . $ProductName . '"' ?

$ProductName='Name" OR 1=1 --'
Тогда строка запроса будет такой:
'DELETE FROM table WHERE ProductName="Name" OR 1=1'
и mysql_escape_string() может не помочь. Dmitri P.
Код: plaintext
1.
2.
$ProductName='Name" OR 1=1 --';
$str = 'DELETE FROM table WHERE ProductName="' . mysql_escape_string($ProductName) . '"';
даст такой запрос:
Код: plaintext
1.
DELETE FROM table WHERE ProductName="Name\" OR  1 = 1  --"

Будет предпринята попытка снести продукт с именем 'Name" OR 1=1 --', а не все данные.
...
Рейтинг: 0 / 0
20.10.2005, 10:25
    #33334441
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
Во-первых, нет никакой реальной необходимости делать запросы на удаление с передаваемым с клиента текстовым параметром.
(тут я писал всякие умные слова, но подумал, что какой смысл, если об этом уже написано ?) )
...
Рейтинг: 0 / 0
20.10.2005, 10:45
    #33334495
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(SQL) проверка введенных данных (защита)
DocAlВо-первых, нет никакой реальной необходимости делать запросы на удаление с передаваемым с клиента текстовым параметром.
(тут я писал всякие умные слова, но подумал, что какой смысл, если об этом уже написано ?) )Спасибо за ссылку, я когда-то видел подобное описание, но к сожалению не сделал на нее закладку и не мог повторно найти.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (SQL) проверка введенных данных (защита) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]