PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
iv888
Отправлено: 12 Марта, 2019 - 16:42:22
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




Hello freiends!
Возможен ли DROP TABLE в таком кейсе? Другие случаи инъекций не интересуют.

PHP:
скопировать код в буфер обмена
  1.    $stmt = $this->connection->prepare("INSERT INTO ".$this->my_canal." (login, text) values (?, ?)") or exit(' :( ');


Спасибо заранее .
 
 Top
andrewkard
Отправлено: 12 Марта, 2019 - 16:53:35
Post Id


Участник


Покинул форум
Сообщений всего: 1269
Дата рег-ции: Нояб. 2014  


Помог: 23 раз(а)




iv888 пишет:
Hello freiends!
Возможен ли DROP TABLE в таком кейсе? Другие случаи инъекций не интересуют.

PHP:
скопировать код в буфер обмена
  1.    $stmt = $this->connection->prepare("INSERT INTO ".$this->my_canal." (login, text) values (?, ?)") or exit(' :( ');


Спасибо заранее .


нет
 
 Top
Мелкий Супермодератор
Отправлено: 12 Марта, 2019 - 17:02:30
Post Id



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


Покинул форум
Сообщений всего: 11797
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 596 раз(а)




Зависит от того, что такое $this->my_canal и где меняется, а так же от самого $this->connection - вы не написали что это.


-----
PostgreSQL DBA
 
 Top
iv888
Отправлено: 12 Марта, 2019 - 17:12:46
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




andrewkard, благодарю

Мелкий, благодарю
$this->my_canal это protected алиас для переменной $canal, а $canal - это $_GET['canal'], которая устанавливается пользователем. Попадет в класс через метод и там выполняется вышеуказанный код.
Если такого канала нет, то устанавливается $this->my_canal = 'first_canal'

Могу показать весь листинг.

Суть в том, что пользователь может ввести любые значения в input canal
(Вывод и внедрение данных в данном случае не страшно) ... Главное DROP
 
 Top
Мелкий Супермодератор
Отправлено: 12 Марта, 2019 - 17:28:30
Post Id



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


Покинул форум
Сообщений всего: 11797
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 596 раз(а)




Теоретически ничто не мешает.
Например для pdo_pgsql проверил - можно и drop table сделать, были бы права у пользователя.

Это в целом плохая мысль использовать пользовательские данные в качестве имени таблицы.


-----
PostgreSQL DBA
 
 Top
iv888
Отправлено: 12 Марта, 2019 - 17:53:41
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




Там суть в том, что кроме каналов нет ничего в БД.
userlogin - только имя отправленное пользователем - произвольное.

Да, проверил просто DROP из php, похоже, можно DROP.

Мдя, тогда придется на хостинге закрыть DROP


P.S.
Благодарю! Вопрос решен!

(Отредактировано автором: 12 Марта, 2019 - 17:55:09)

 
 Top
andrewkard
Отправлено: 12 Марта, 2019 - 17:54:53
Post Id


Участник


Покинул форум
Сообщений всего: 1269
Дата рег-ции: Нояб. 2014  


Помог: 23 раз(а)




Мелкий пишет:
pdo_pgsql проверил - можно и drop table

с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?

(Отредактировано автором: 12 Марта, 2019 - 17:56:06)

 
 Top
iv888
Отправлено: 12 Марта, 2019 - 18:08:55
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




andrewkard пишет:
Мелкий пишет:
pdo_pgsql проверил - можно и drop table

с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?


У меня prepared statement только на данные, но переменная для выбора таблицы не вписывается в модель prepared statement.

Это динамический выбор таблицы

(Отредактировано автором: 12 Марта, 2019 - 18:10:00)

 
 Top
andrewkard
Отправлено: 12 Марта, 2019 - 18:13:40
Post Id


Участник


Покинул форум
Сообщений всего: 1269
Дата рег-ции: Нояб. 2014  


Помог: 23 раз(а)




Проверить по белому списку
 
 Top
Мелкий Супермодератор
Отправлено: 12 Марта, 2019 - 18:28:53
Post Id



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


Покинул форум
Сообщений всего: 11797
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 596 раз(а)




andrewkard пишет:
с подготовленным запросом можно выполнить drop table ? Вернее втыкнуть инъекцию?

А что вас собственно удивляет?
Если продолжать конкатенировать запрос с данными - то ничего не изменится. prepared statement не серебряная пуля, а лишь транспорт.

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

iv888 пишет:
но переменная для выбора таблицы не вписывается в модель prepared statement.

Этот мой комментарий относился именно к вашей модели данных.
Использовать пользовательский ввод в качестве имени объекта - идея плохая и так быть не должно.


-----
PostgreSQL DBA
 
 Top
iv888
Отправлено: 12 Марта, 2019 - 18:41:27
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




andrewkard пишет:
Проверить по белому списку

Это есть, но для снижения нагрузки хотелось бы отключить эту опцию
(Добавление)
iv888 пишет:
andrewkard пишет:
Проверить по белому списку

Это есть, но для снижения нагрузки хотелось бы отключить эту опцию



Цитата:
Этот мой комментарий относился именно к вашей модели данных.
Использовать пользовательский ввод в качестве имени объекта - идея плохая и так быть не должно.

Делать отдельную таблицу сопоставления?
Дело в том, что сейчас так удобно создавать новые каналы ...

Вообще тогда исходя из сказанного Мелким, получается на выбор таблицы надо делать
switch

(Отредактировано автором: 12 Марта, 2019 - 18:50:31)

 
 Top
Мелкий Супермодератор
Отправлено: 12 Марта, 2019 - 20:38:22
Post Id



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


Покинул форум
Сообщений всего: 11797
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 596 раз(а)




Гипотеза: у вас некоторое число таблиц идентичной структуры.
Почему я так подумал: если бы структуры были различны - у вас бы не стояло вопроса как проверять имя таблицы, а выбор был бы детерминирован.
Вывод: это должна быть одна таблица. Имя искусственного водного пути (хотя при чём тут водные пути? Но canal это именно оно) - такой же параметр запроса, а не имя таблицы.
В итоге вы ищите проблему там где её нет, просто соорудив странную схему базы.


-----
PostgreSQL DBA
 
 Top
iv888
Отправлено: 12 Марта, 2019 - 20:43:30
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2019  


Помог: 0 раз(а)




Цитата:
Гипотеза: у вас некоторое число таблиц идентичной структуры.

Да.

PHP:
скопировать код в буфер обмена
  1. Вывод: это должна быть одна таблица.

Т.е. все сообщения писать в одну таблицу, добавив в таблицу столбец имя чата (канала)?


Мне показалось, так удобней оперировать каналами.
(Добавление)
update
Да, в принципе да, все так.
Наверное так и переделаю.

Единственное удобство оперирования немного снижается.
(Добавление)
Не , не снижается...
Спасибо все решил

(Отредактировано автором: 12 Марта, 2019 - 20:46:54)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB