Перейти к содержимому


Безопасные функции работы с SQL. Оформление исходного кода.


Сообщений в теме: 7

#1 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 16 Июль 2012 - 15:17

Дорогие разработчики конфигураций Кб. Сложилась такая ситуация, что при достаточно защищенной программе, периодически возникают дыры в программе, благодаря дырам в конфигурациях. В связи с чем были разработаны безопасные функции работы с SQL.
sql_select, sql_select_field, sql_insert, sql_delete, sql_update, и их аналоги data_select и т.п.
Использование данных функций защитит вас от SQL инъекций. Да, их не всегда возможно использовать, но в 90% случаев их достаточно.

Также желательно разрабатывать конфигурации в едином стиле. Уважайте людей которые будут поддерживать написанный вами код.

Более подробное описание по ссылке:

http://clientbase.ru...lenie_php_koda/

#2 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 28 Июль 2013 - 07:04

Согласно документации функции с приставкой sql работают с названием таблицы, но судя по всему они работают только с ID. Почему?

#3 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 29 Июль 2013 - 08:48

Пример?

#4 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 29 Июль 2013 - 09:14

Например, функция sql_insert имеет такое начало
function sql_insert($table_name, $data)
{
  global $channel_tables;
  $table_name=str_replace('`','',addslashes($table_name));
  $sql_query="INSERT INTO `".$table_name."` (";
  $vals="";
Судя по коду, переменная $table_name это не имя, а ID таблицы

#5 Analitic

    Активный участник

  • Пользователи
  • PipPipPip
  • 700 сообщений
  • Пол:Мужчина

Отправлено 29 Июль 2013 - 10:53

Судя по коду, это все таки имя. Если для вас это не очевидно, проверьте на практике.

#6 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 29 Июль 2013 - 11:16

В том то и дело, что сначало попробовал. Писал имя таблицы с разными кавычками - не работает. Когда прописываю только ID таблицы - работает.
Я не очень сильный программист, но насколько я понимаю конструкция INSERT INTO работает с ID, а не с именем. Соответственно вначале функции должен быть код, который бы получал ID таблицы по ее имени, как например здесь
function insert_query($data, $name_table)
{
  global $user, $lang;
  // получаем id таблицы по ее имени
  $sqlQuery = "SELECT * FROM ".TABLES_TABLE." WHERE name_table='$name_table'";
  $result = sql_query($sqlQuery);
  $table = mysql_fetch_array($result);
  $table_id = $table['id'];


#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2013 - 12:45

Цитата

В том то и дело, что сначало попробовал. Писал имя таблицы с разными кавычками - не работает. Когда прописываю только ID таблицы - работает.

А Вы случаем не путаете две разных функции sql_insert и data_insert ? Может все-таки работали с data_insert ? Первая работает исключительно с внутренними именами таблиц (любыми, включая системные), а вторая с id таблиц конфигурации (их внутреннее имя начинается с "cb_data"). Запись data_insert(14, $data) равнозначна sql_insert("cb_data14", $data) или sql_insert(DATA_TABLE.14, $data)

Цитата

но насколько я понимаю конструкция INSERT INTO работает с ID

http://phpclub.ru/my...doc/insert.html - где Вы тут увидели ID? В MySQL вообще отсутствует такое понятие. См. выше что я писал насчет имен.

Цитата

Соответственно вначале функции должен быть код, который бы получал ID таблицы по ее имени, как например здесь

Функция "insert_query" работает с внешними ("русскими") именами. Поэтому вначале получает id таблицы, чтобы затем использовать его в том же data_insert. У вас, очевидно, какая то каша в голове из функций.

#8 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 29 Июль 2013 - 15:55

Теперь понятно, перепутал внутренние и внешние имена.





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных