Mysql Защита от SQL-инъекций в PHP и MySQL

Фанат

oncle terrible
Команда форума
что характерно, про "классы из коробки" по ссылке тоже написано :)

не говоря уже о том, что "стандартный экстеншн мускуля" - это mysql, а никак не глючный mysqli.
 

Ragazzo

TDD interested
Baton
Нет, не ответит, т.к. ты пишешь чушь. просто тут уже привыкли что раз в месяц забегаю люди, которые делали "high-load" проекты и спешат поделиться своим бесценным опытом, таких просто игнорируют, а общаться на форуме надо корректно.
 

Вурдалак

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

Фанат

oncle terrible
Команда форума
Ragazzo
ну, во-первых, некорректно общаться первым начал я.
просто выступление абсолютно не в тему в двух топиках подряд несколько раздражает.
Хотя надо все равно быть терпеливее, и указывать людям на ошибки вежливее. Это продуктивнее.

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

Но вообще - да. В принципе, хамить не должен никто - ни ламер, ни гуру.
Но хамящий гуру выглядит некультурно, а хамящий ламер выглядит клоуном.
 

Baton

Новичок
Baton, никто в здравом уме не использует MySQL API напрямую, используются обёртки, в них же делается проверка один раз на успешность выполнения запроса.
Спасибо за единственный ценный комментарий по теме.

Я это понимаю, и использую pdo :)
 

fixxxer

К.О.
Партнер клуба
Пробовал я тут, в рамках упражнения "написать небольшое приложение для запуска на всяких хостингах", пользоваться PDO напрямую.

Продержался часа два, после чего неминуемо появилась обертка :)
 

fixxxer

К.О.
Партнер клуба
Да в крупных проектах у меня свои велосипеды, а тут хотелось тащить по минимуму барахла, и уже пофигу - сделано, работает, и фиг с ним.
 

Тугай

Новичок
Покритикую.
Статья называется "Защита от SQL-инъекций в PHP и MySQL".
Нет анализа инъекций, а сразу предлагаются некие решение. А сами инъекции всплывают между строк. Типа их все знают. :)

Из текста статьи удается выделить три типа инъекций или уязвимостей.
Первая изменение объектов бд (имени поля или имени таблицы или направление сортировки или ...) в динамически формируемом запросе, когда они передаются через параметры.
Решение - белый список.

Вторая уязвимость связана с подменой, не объектов базы данных, а их значений.
Например, можно получить 'where a=1; drop table mytable;' вместо 'where a=1'.
Решение - умное экранирование через типизованые плейсхолдеры.

Третья связана с кодировками, не ясно только, что же за уязвимость и как от нее защитится.
 

fixxxer

К.О.
Партнер клуба
А зачем эту фигню классифицировать? Это примерно как перечислять предметы, которые могут украсть из квартиры, если не поставить замок.
Инъекция - это пересечение границы данных и кода, всё. То же переполнение буфера в коде на С, кстати, ровно то же самое.
 

Тугай

Новичок
А зачем эту фигню классифицировать? Это примерно как перечислять предметы, которые могут украсть из квартиры, если не поставить замок.
Инъекция - это пересечение границы данных и кода, всё. То же переполнение буфера в коде на С, кстати, ровно то же самое.
Потому, что задачу по безопасности нельзя решать в такой общей постановке как "пересечение границы данных и кода".
Можно решить какие-то самые распространенные частные случаи, что и сделано в статье.

Ставят замок, за ним сигнализацию, важные предметы прячут в сейф, заводят злую собаку, решетки на окнах и т.д. и т.п. и все равно все это можно обойти. :)
 

fixxxer

К.О.
Партнер клуба
флоппик

Оу. "Специалисты по безопасности" это вообще отдельная каста невменяемых =) Хуже только интеграторы.
 

Vladson

Сильнобухер
По мне так нет никакой опасности и безопасности, есть код глючный (который делает не только то что должен но и то что не должен) и есть код не глючный (где данные идут в нужном месте в нужное время) если писать первый то никакие библиотеки не помогут, если второй то и о безопасности думать не нужно...
 

Тугай

Новичок
Для разнообразия, в статье одни select'ы, вот старая функция для INSERT и UPDATE:
PHP:
  function tep_db_perform($table, $data, $action = 'insert', $parameters = '', $link = 'db_link') {
    reset($data);
    if ($action == 'insert') {
      $query = 'insert into ' . $table . ' (';
      while (list($columns, ) = each($data)) {
        $query .= $columns . ', ';
      }
      $query = substr($query, 0, -2) . ') values (';
      reset($data);
      while (list(, $value) = each($data)) {
        switch ((string)$value) {
          case 'now()':
            $query .= 'now(), ';
            break;
          case 'null':
            $query .= 'null, ';
            break;
          default:
            $query .= '\'' . tep_db_input($value) . '\', ';
            break;
        }
      }
      $query = substr($query, 0, -2) . ')';
    } elseif ($action == 'update') {
      $query = 'update ' . $table . ' set ';
      while (list($columns, $value) = each($data)) {
        switch ((string)$value) {
          case 'now()':
            $query .= $columns . ' = now(), ';
            break;
          case 'null':
            $query .= $columns .= ' = null, ';
            break;
          default:
            $query .= $columns . ' = \'' . tep_db_input($value) . '\', ';
            break;
        }
      }
      $query = substr($query, 0, -2) . ' where ' . $parameters;
    }

    return tep_db_query($query, $link);
  }

  function tep_db_input($string, $link = 'db_link') {
    global $$link;

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($string, $$link);
    } elseif (function_exists('mysql_escape_string')) {
      return mysql_escape_string($string);
    }
    return addslashes($string);
  }
insert:
PHP:
tep_db_perform('table', array(
'type' => $_GET['type'],
'price' => $_GET['max_price'],
));
И благодаря статье правильный update будет:
PHP:
tep_db_perform('table', array(
'type' => $_GET['type'],
'price' => $_GET['max_price'],
),
'update',
sprintf('id=%d', $_GET['id'])
);
Но с масивом $data делать ничего не надо.
Так что фраза в начале статьи
1.данные подставляем в запрос только через плейсхолдеры
слишком сильное утверждение.
 
Сверху