Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какие символы опасны в sql запросах, Защита от sql injection 
:(
    Опции темы
anurbol
Дата 10.5.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 30.5.2007
Где: Алматы, Казахстан

Репутация: нет
Всего: нет



К сожалению не нашел в нете подробно об этом.
Знаю что  и  а недавно заинтересовало, является ли } (фигурная скобка) опасным символом? Просто в моем движке он никак не экранируется/кодируется, а ведь есть запросы типа 
Код

SELECT * FROM table WHERE foo={$bar}

И вообще какие еще символы нужно преобразовывать?

Это сообщение отредактировал(а) anurbol - 10.5.2010, 15:12
PM MAIL   Вверх
SickFxck
Дата 10.5.2010, 15:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Опасных символов нет вообще. Ты правда считаешь, что это вопрос "для профи"?
PM MAIL   Вверх
bars80080
Дата 10.5.2010, 15:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



любой символ - это набор байт, которые не имеют между собой никакой разницы. было бы по меньшей мере странно, если бы определённую комбинацию байт можно было бы хранить в БД, а другую нет. ущербная база получается

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

чтобы этого не происходило было введено простое правило экранирования служебных символов. (служебных, а не опасных!).
а чтобы лень программиста вообще ничем не тревожить были придуманы методы экранировки то что называется in one click, в данном случае в одну функцию. достаточно пропустить данные через mysql_real_escape_string($data); и всё заэкранируется где надо и как надо
PM MAIL WWW   Вверх
anurbol
Дата 10.5.2010, 15:57 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 30.5.2007
Где: Алматы, Казахстан

Репутация: нет
Всего: нет



про mysql_real_escape_string знаю давно, но мой использует не его, а просто во всех входящих $POST данных, ' и & перерабатывает в html сущности. Просто как бы хотел поинтересоваться у профи,  является ли { опасным (служебным если хотите) символом, mysql_real_escape_string его не обрабатывает.

Добавлено через 1 минуту и 2 секунды
просто где то давно об этом прочитал мимолетом, не обратил внимание, не знаю может то было просто мнение какого нибудь дилетанта на форуме. 
PM MAIL   Вверх
LeoK
Дата 10.5.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 14.12.2007
Где: Moscow

Репутация: нет
Всего: нет



Цитата(anurbol @  10.5.2010,  15:12 Найти цитируемый пост)
 SELECT * FROM table WHERE foo='{$bar}'

В приведенном вами примере при наличии данной строки в двойных кавычках php подставит переменную и соответственно убьёт символы фигурных скобок... непонятно в чем сложности? mysql эти скобки по барабану вроде как
PM MAIL   Вверх
SickFxck
Дата 10.5.2010, 17:22 (ссылка) |   (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Цитата(anurbol @  10.5.2010,  15:57 Найти цитируемый пост)
про mysql_real_escape_string знаю давно, но мой использует не его, а просто во всех входящих $POST данных, ' и & перерабатывает в html сущности

— ты превращаешь код в полное дерьмо.
PM MAIL   Вверх
bars80080
Дата 10.5.2010, 20:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



Цитата(anurbol @  10.5.2010,  15:57 Найти цитируемый пост)
а просто во всех входящих $POST данных, ' и & перерабатывает в html сущности

конечно, задать вопрос - "зачем?", бессмысленно?

сам посуди - пользователь вводил некий текст, который содержал кавычки. ты его переписываешь в хтмл-сущности. ладно, для отображения в некоем хтмл-теле страницы оно сойдёт. но если был ввод шаблона поиска? или данные в последствии будут отданы в качестве ленты куда-то ещё?
к примеру, человек вводит ... ООО "ГлавСтрой" .... ты его преобразуешь в ООО &quote;Главстрой, найдёт ли пользователь поиском этот текст?


Цитата(anurbol @  10.5.2010,  15:57 Найти цитируемый пост)
про mysql_real_escape_string знаю давно

тогда какие вопросы, если ты знаешь, что она экранирует все служебные символы?
или может быть не знаешь?
PM MAIL WWW   Вверх
anurbol
Дата 10.5.2010, 21:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 30.5.2007
Где: Алматы, Казахстан

Репутация: нет
Всего: нет



Спасибо, что прояснили ситуацию, а насчет поиска, можно делать htmlspecialchars_decode и все.
PM MAIL   Вверх
SickFxck
Дата 10.5.2010, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Цитата(anurbol @  10.5.2010,  21:25 Найти цитируемый пост)
насчет поиска, можно делать htmlspecialchars_decode и все. 

— серьёзно?
PM MAIL   Вверх
bars80080
Дата 11.5.2010, 00:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



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

и что я сегодня такой добрый?
PM MAIL WWW   Вверх
SelenIT
Дата 11.5.2010, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



anurbol, у языка SQL, как и языка HTML, есть свои правила. Которые нужно соблюдать при работе с этими языками. Нет общих правил "на все случаи жизни", которыми можно разом "заткнуть все дыры и там, и там".

Аналогия IRL: перед едой принято мыть руки с мылом, перед походом в театр принято чистить ботинки обувным кремом. Как выглядит человек, трущий руки смесью мыла с обувным кремом ("чтобы пойти в театр, а там поесть") - нелепо, правда? Но именно так выглядит со стороны "преобразование спецсимволов HTML в сущности во всех входящих данных", особенно если это позиционируется как "защита от иньекций" (к которым оно никаким боком).

Настоятельная просьба внимательно и вдумчиво прочитать PHP FAQ:  \"Кавычки \". Cоставление запросов, слеши, SQL Injection. От начала до конца.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
anurbol
Дата 11.5.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 30.5.2007
Где: Алматы, Казахстан

Репутация: нет
Всего: нет



Цитата

Спасибо, что прояснили ситуацию, а насчет поиска, можно делать htmlspecialchars_decode и все. 


о боже, какой я идиот... простите я видимо очень спать хотел и как то ляпнул не то  smile 

Конечно обидно, то что вы пишете, но все же моя цель - получить помощь а не спорить поэтому собственно прошу у вас помощи поправить в моем движке то что нужно. Дело в том что движок не мой, движок платный.


В файле header.php (который подключается к абсолютно всем файлам) 
есть следующяя обработка
Код

$_POST = security($_POST);
$_GET = security($_GET);
$_COOKIE = security($_COOKIE);



Ну а вот собственно сама функция.

Код

// THIS FUNCTION STRIPSLASHES AND ENCODES HTML ENTITIES FOR SECURITY PURPOSES
// INPUT: $value REPRESENTING A STRING OR ARRAY TO CLEAN
// OUTPUT: THE ARRAY OR STRING WITH HTML CHARACTERS ENCODED

function security($value)
{
    if( is_array($value) )
  {
      $value = array_map('security', $value);
    }
  else
  {
      if( !get_magic_quotes_gpc() )
    {
        $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
      }
    else
    {
        $value = htmlspecialchars(stripslashes($value), ENT_QUOTES, 'UTF-8');
      }
      $value = str_replace("\\", "\\\\", $value);
    }
    return $value;
}



Так вот, встает вопрос, неужели этого недостаточно, и все равно надо использовать mysql_real_escape_string() ? 
Раньше кстати я и обрабатывал все данные с ее помощью, а числовые с помощью intval или даже round(floatval($var),4)

Но тогда я не видел что у меня в хедере есть функция security(), а когда увидел, решил нигде не обрабатывать с помощью mysql_real_escape_string. 

Помогите!! Где я не прав??

Добавлено через 13 минут и 14 секунд
может просто 
Код

if( !get_magic_quotes_gpc() )
    {
        $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
      }
    else
    {
        $value = htmlspecialchars(stripslashes($value), ENT_QUOTES, 'UTF-8');
      }
      $value = str_replace("\\", "\\\\", $value);


переделать в
 
Код

в mysql_real_escape_string($value); 
 
и все??

Это сообщение отредактировал(а) anurbol - 11.5.2010, 14:33
PM MAIL   Вверх
bars80080
Дата 11.5.2010, 14:55 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



эта функция написана человеком не понимающим смысла обработки данных для вставки в БД. к сожалению, таких на пхп большинство, а то что они пишут большие проекты - ничего не значит.
единственное, что имеет смысл делать на входе - инициализировать необходимые переменные, причём только те, что нужны

то есть в примитивном идеале, обработка выглядит так:

Код

function init_var($arr, $type = 'string') {
    foreach($arr as $v) {
        switch($type) {
            case 'string': $_REQUEST[$v] = (isset($_REQUEST[$v])) ? $_REQUEST[$v].'' : ''; break;
            case 'int': $_REQUEST[$v] = (isset($_REQUEST[$v])) ? intval($_REQUEST[$v]) : 0; break;
            case 'float': $_REQUEST[$v] = (isset($_REQUEST[$v])) ? float($_REQUEST[$v]) : 0; break;
            case 'bool': $_REQUEST[$v] = (empty($_REQUEST[$v])) ? false : true; break;
        }
    }
    // можно очищенные значения пихать не обратно в $_REQUEST, а в некий массив и возвращать этой функцией
}


всё, ничего больше на входе с переменными происходить не должно. в итоге ты точно будешь знать, что у тебя есть переменная $_REQUEST['some_var'], которая не будет случайно отсутствовать в коде или иметь не ожидаемый тип

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

Код

$fields = array(
    array('name', $_REQUEST['name'], 1),
    array('age', $_REQUEST['age'], 0),
);
$r = writeRow('insert', 'mytable', $field);

    function writeRow($type, $table, $arField, $hvost = '') {
        
        if($type != 'insert' && $type != 'update') { return false; }
        $c = count($arField);
        $fields = array(); $values = array();
        if($type == 'insert') {
            
            $sql = 'INSERT INTO `'.$table.'` ';
            for($i = 0; $i < $c; $i++) {
                
                $fields[$i] = '`'.$arField[$i][0].'`';
                $values[$i] = mysql_real_escape_string($arField[$i][1]);
                
                if(!empty($arField[$i][2])) { $values[$i] = '"'.$values[$i].'"'; }
            }
            if(empty($fields) || empty($values)) { return false; }
            $sql .= '('.implode(', ', $fields).') VALUES ('.implode(', ', $values).') '.$hvost;
        }
        else {
            
            $sql = 'UPDATE `'.$table.'` SET ';
            for($i = 0; $i < $c; $i++) {
                $value = mysql_real_escape_string($arField[$i][1]);
                
                if(!empty($arField[$i][2])) { $value = '"'.$value.'"'; }
                $fields[$i] = '`'.$arField[$i][0].'`='.$value;
            }
            if(empty($fields)) { return false; }
            $sql .= implode(', ', $fields).' '.$hvost;
        }
        $r = mysql_query($sql);
        
        return $r;
    }

в итоге ни одного лишнего действия, и ни капли искажения данных, но с полным соблюдением безопасности

PM MAIL WWW   Вверх
SelenIT
Дата 11.5.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



Цитата(anurbol @  11.5.2010,  14:27 Найти цитируемый пост)
Где я не прав??

1) В нежелании разобраться, что делает и для чего нужна ф-ция mysql_real_escape_string, а что и для чего - htmlspecialchars;
2) В нежелании внимательно прочитать ссылку.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
LeoK
Дата 11.5.2010, 16:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 14.12.2007
Где: Moscow

Репутация: нет
Всего: нет



Цитата(bars80080 @  11.5.2010,  14:55 Найти цитируемый пост)
$fields = array(    array('name', $_REQUEST['name'], 1),    array('age', $_REQUEST['age'], 0),);

ну в вашем случае я бы еще исключил $_REQUEST в пользу $_GET $_POST
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.