powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (SQL) проверка введенных данных (защита)
14 сообщений из 14, страница 1 из 1
(SQL) проверка введенных данных (защита)
    #33333320
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
На 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
(SQL) проверка введенных данных (защита)
    #33333402
Dmitri P.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функцию mysql_escape_string необходимо применять к значениям полей, и желательно эти значения заключать в кавычки(одинарные или двойные)
Я бы сделал так:
Код: plaintext
1.
$str="DELETE FROM table WHERE Id='" . mysql_escape_string($Id) . "';");
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33333427
Dmitri P.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, на вотрос так и не ответил...

В приведенном табой примере, я могу отправить строку "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
(SQL) проверка введенных данных (защита)
    #33333440
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. достаточно добавить кавычки?
а нет ли такой функции, которая бы отсекала служебные слова или символы, или того, что Вы привели достаточно?
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33333461
Dmitri P.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Baginт.е. достаточно добавить кавычки?
Смотря по ситуации.
Как правило, добавление кавычек решает проблему. Я еще ниразу не сталкивался с тем, чтобы это не помогло :)

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

Так, небольшое добавление, если априорно известно, что ID - целое число,лучше сделать $Id = intval($_POST['var1']);
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33333508
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() может не помочь.
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33333539
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот когда последний раз тот гандурас под названием 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
(SQL) проверка введенных данных (защита)
    #33333550
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
(SQL) проверка введенных данных (защита)
    #33333574
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за помощь! буду пробовать.
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33333623
1024byte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(SQL) проверка введенных данных (защита)
    #33334059
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вы тут навыдумывали...
id -- это же число тут?
Ну так и говорим, что
$Id = intval($_POST['var1']);
Другое дело, что с помощью этого скрипта можно удалить любой элемент из таблицы, но это никаким экранированием не исправишь.
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33334297
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(SQL) проверка введенных данных (защита)
    #33334441
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, нет никакой реальной необходимости делать запросы на удаление с передаваемым с клиента текстовым параметром.
(тут я писал всякие умные слова, но подумал, что какой смысл, если об этом уже написано ?) )
...
Рейтинг: 0 / 0
(SQL) проверка введенных данных (защита)
    #33334495
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAlВо-первых, нет никакой реальной необходимости делать запросы на удаление с передаваемым с клиента текстовым параметром.
(тут я писал всякие умные слова, но подумал, что какой смысл, если об этом уже написано ?) )Спасибо за ссылку, я когда-то видел подобное описание, но к сожалению не сделал на нее закладку и не мог повторно найти.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (SQL) проверка введенных данных (защита)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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