Forums / National / Russian / Тех. поддержка / Экстраполе file - потенциальная уязвимость?

Вопрос к разработчикам о целесообразности использования экстраполя file

Roffun
#1 2015-10-02 17:46

Добрый день,

у меня появился вопрос к разработчикам Cotonti насчет целесообразности использования экстраполей типа file.

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

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

Вопрос:

Создание экстраполя file c проверкой расширений txt,html,  и размещение его в шаблон , обрамленное условием "только для админа" несет в себе уязвимость ?

если да, то почему экстраполе этого типа доступно для создания без пояснения о риске?

Есть плагин confirmtheright, который при установке создает два экстраполя типа file для users, и на этом его работа заканчивается. Дальше работают теги размещенные в шаблон:

<!-- IF {PHP.cot_plugins_active.confirmtheright} AND {PHP.usr.isadmin} -->
    <tr>
        <td>{USERS_PROFILE_CONFIRMTHERIGHT1_TITLE} <small>( {PHP.cot_extrafields.cot_users.CONFIRMTHERIGHT1.field_variants} )</small></td>
        <td>{USERS_PROFILE_CONFIRMTHERIGHT1}</td>
    </tr>
    <tr>
        <td>{USERS_PROFILE_CONFIRMTHERIGHT2_TITLE} <small>( {PHP.cot_extrafields.cot_users.CONFIRMTHERIGHT2.field_variants} )</small></td>
        <td>{USERS_PROFILE_CONFIRMTHERIGHT2}</td>
    </tr>
<!-- ENDIF -->

Macik написал что есть потенциальная уязвимость:  

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

Порекомендовал сделать проверку:

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

 Дело в том, что если исходить из вышесказанного, то экстраполе file использовать нельзя, так как сделать проверку иначе как в шаблоне, со стороны обычного пользователя не получится. Сами экстраполя создаются для использования в шаблоне. Или каждому пользователю который захочет создать экстраполе, нужно будет писать обработчик собственный, так зачем тогда экстраполе нужно?

Сама логика ситуации заключается в том, что нужно было каждый раз загружать/удалять на сервер проверочный файл, или создавать экстраполе file, для каждого сайта, чтобы подтверждать права с помощью загрузки текстового или html файла на сервер.

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

Разница между установкой плагина и ручным созданием поля для каждого сайта - только в автоматизации процесса создания поля.

  • Нужна ли в плагине проверка того, к чему он не имеет прямого отношения ?
  • Насколько безопасно использовать экстраполе file в разных частях сайта для определенных файлов (изображения, txt, html)
Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts
Macik
#2 2015-10-03 22:41

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

Попробую объяснить.
1. Механизм Экстраполей — это возможность создать дополнительное поле данных для какой либо сущности, используемой системой (ядром или расширением). Дополнительное поле будет присутствовать у всех элементов данной сущности. Т.е. если мы создаем дополнительное поле данных для страницы, то у всех страниц будет присутствовать это дополнительное поле. В твоем случае, использовать доп.поля для хранения доп.данных у единичного элемента — логически (и идеологически) не верно. Это, во-первых, избыточно — поля данных создаются у всех пользователей, хотя реально используются только у одного (у админа). Во-вторых, мы дополнительно получаем необходимость разруливать кто из пользователей может этим пользоваться, а кто нет (то с чем ты столкнулся), хотя экстраполя изначально предназначались для равнозначного использования со всеми элементами.

2. Использование условий в шаблонах, это, в принципе, своего рода костыль (точнее не правильное испольование ).  При разработке правильных приложений алгоритмическая логика должна быть максимально отделена от (логики) отображения. Т.е. в идеале все должно стремится к варианту проектирования по типу MVC (или аналогичному). Единственно правильная логика (условия) в шаблонах, которые там «правильно» использовать, это логика отображения конечных данных. Т.е., если простыми словами, варианты оформления данных (например каким цветом вывести счетчик взависимости от чисел на нем, или какую иконку пользователя вывести в зависимости от того залогинен ли он). У тебя, в данном случае, в шаблоне логика уровня приложения (которая влияет на его функционал).

3. Ты правильно пишешь, что разница между плагином и ручной установкой только в создании поля. Но почему-то полагаешь, что поле должно уметь само решать какие данные фильтровать, какие нет. Но это не правильно, т.к. это всегда было задачей расширения.

Отвечая на поставленные вопросы:

  • нужна ли проверка? Да нужна, если ты хочешь решить поставленную задачу, т.к. используемые тобой механизмы (экстраполя и шаблоны) эту задачу не решают.
  • на сколько безопасно… очень условная шкала. Есть ряд методов, которые позволяют угрозу снизить, но нет «серебрянной пули». Дело тут не в Cotonti или его механизмах, а дело в принципе. Как только ты позволяешь грузить что-то кому-то кроме себя (админа) это уже потенциальная уязвимось.

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

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
Roffun
#3 2015-10-04 07:21
#41059 Macik:
3. Ты правильно пишешь, что разница между плагином и ручной установкой только в создании поля. Но почему-то полагаешь, что поле должно уметь само решать какие данные фильтровать, какие нет. Но это не правильно, т.к. это всегда было задачей расширения.

Отвечая на поставленные вопросы:

  • нужна ли проверка? Да нужна, если ты хочешь решить поставленную задачу, т.к. используемые тобой механизмы (экстраполя и шаблоны) эту задачу не решают.
  • на сколько безопасно… очень условная шкала. Есть ряд методов, которые позволяют угрозу снизить, но нет «серебрянной пули». Дело тут не в Cotonti или его механизмах, а дело в принципе. Как только ты позволяешь грузить что-то кому-то кроме себя (админа) это уже потенциальная уязвимось.
А рзве у пользователя есть другие варианты кром проверок в шаблоне типа?
<!-- IF  {PHP.usr.isadmin} -->{ЭКСТРАПОЛЕ}<!-- ENDIF -->

Если да, то где они написаны ?  При создании экстраполя ничего подобного не пишется..

 

Я понял твою логику, она верна если цель - создание плагина, с отдельным загрузчиком. Но такой цели не было. 

Была одна цель :  создать автоматически экстраполе файл, которое в свою очередь создает загрузчик проверочных файлов типа html или txt в корень сайта для подтверждения прав с последующим удалением.

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

 

Теперь давай представим что этот пользователь пришел на форум, почитал топики, понял что есть какой-то механизм под названием экстраполя, и задал вопрос, есть ли возможность сделать такую фишку на базе этих экстраполей?

Какой ответ в таком случае получил бы пользователь ?

 

Если смотреть с точки зрения этого пользователя, и наличия подручных возможностей, то все сводится к экстраполям в профиле.

Значит нужно создать экстраполе file, и разместить его в шаблоне. При создании поля подсказка указывает, что теги будут работать в:

 

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

 

Вопрос: что делать пользователю в такой ситуации ?  не пользоваться экстраполем типа file вообще потому что это уязвимость ?

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

 


Плагин появился только для создания экстраполя. Без использования плагина можно все это проделать из админки самостоятельно, дальше работает механизм экстраполя file. Он вообще ничего не делает кроме создания экстраполя.

Рассуждать о потенциальных угрозах можно в теории, но на практике меня интересует ответ на один - единственный вопрос:

Для чего предназначено экстраполе file для cot_users ?

если его нельзя использовать, я просто удалю плагин который создает его и на этом закончится вопрос. 

Проверка на сервере решит вопрос безопасности ?

например:

если на хук extrafields.import.file.first подцепить:

global $usr;
if($usr['isadmin']){
cot_error('Вы не можете загружать проверочные файлы', $inputname);
}

Этого будет достаточно ?

 

Добавлено 10 минут спустя:

#41059 Macik:
Подводя итог, тут проблема в не правильном подходе. Для решения этой задачи, да, нужен отдельный плагин, но который берет на себя весь цикл: получение данных, обработка, хранение. Причем лучше использовать хук tools, чтобы страница ввода была в админской части.

Плагин создавался исключительно для автоматизации создания экстраполя, а дальше расчет на механизм api экстраполей, зачем мне делать отдельную страницу, писать обработчики, если смысл был именно создать экстраполе а не работать вместо него ?

Кстати с самого начала в описании к плагину было:

Важно:  плагин создавался из рассчета на одноразовые проверки, по принципу загрузил проверил удалил. На данный момент в нем  два поля, это значит что одновременно может быть загружено максимум два файла. 

Это значит что постоянное нахождение на сервере файла не входило в планы, а только загрузка - проверка - удаление. В том числе удаление плагина (а значит поля). 

Добавлено 1 час спустя:

==========================================

Добавил проверку , является ли пользователь админом.

Цель создания плагина указана выше - автоматическое создание экстраполя. 

Благодарю за конструктивный развернутый ответ, Macik, в любом случае информация полезная.

Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts

Dit bericht is bewerkt door Roffun (2015-10-04 10:27, 8 jaren ago)
Macik
#4 2015-10-04 12:24
#41061 Roffun:
#41059 Macik:
3. Ты правильно пишешь, что разница между плагином и ручной установкой только в создании поля. Но почему-то полагаешь, что поле должно уметь само решать какие данные фильтровать, какие нет. Но это не правильно, т.к. это всегда было задачей расширения.

Отвечая на поставленные вопросы:

  • нужна ли проверка? Да нужна, если ты хочешь решить поставленную задачу, т.к. используемые тобой механизмы (экстраполя и шаблоны) эту задачу не решают.
  • на сколько безопасно… очень условная шкала. Есть ряд методов, которые позволяют угрозу снизить, но нет «серебрянной пули». Дело тут не в Cotonti или его механизмах, а дело в принципе. Как только ты позволяешь грузить что-то кому-то кроме себя (админа) это уже потенциальная уязвимось.
А рзве у пользователя есть другие варианты кром проверок в шаблоне типа?
<!-- IF  {PHP.usr.isadmin} -->{ЭКСТРАПОЛЕ}<!-- ENDIF -->

Если да, то где они написаны ?  При создании экстраполя ничего подобного не пишется..

Экстраполя сами по себе не предназначены для «выборочного» использования. Поэтому никойкой дополнительной проверки нет. Расчет на то, что они создаются для всех пользователей и для всех элементов сущности к которой привязаны.

Я понял твою логику, она верна если цель - создание плагина, с отдельным загрузчиком. Но такой цели не было. 

Была одна цель :  создать автоматически экстраполе файл, которое в свою очередь создает загрузчик проверочных файлов типа html или txt в корень сайта для подтверждения прав с последующим удалением.

Да, в таком виде цель была достигнута. Я лишь предупредил о том, что такое использование может быть опасно.

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

Именно потому, что конечный пользователь ничего не знает — задача разработчика сайта/плагина максимально подумать за него и сделать «защиту от дурака» или умышленного вредительства. (А удалить можно тоже через механизм экстраполей.)

Теперь давай представим что этот пользователь пришел на форум, почитал топики, понял что есть какой-то механизм под названием экстраполя, и задал вопрос, есть ли возможность сделать такую фишку на базе этих экстраполей?

Какой ответ в таком случае получил бы пользователь ?

Если смотреть с точки зрения этого пользователя, и наличия подручных возможностей, то все сводится к экстраполям в профиле.

Значит нужно создать экстраполе file, и разместить его в шаблоне. При создании поля подсказка указывает, что теги будут работать в:

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

Все верно. И тут НЕ сказано добавьте «условий в шаблон», чтобы скрыть какие-то поля у части пользователей. Потому, что использование экстраполя подразумевается равнозначным для всех пользователей без исключения.

Вопрос: что делать пользователю в такой ситуации ?  не пользоваться экстраполем типа file вообще потому что это уязвимость ?

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

Потому, что механизм универсален. И надо включать голову, если мы хотим использовать его несколько не стандартно. 
Это как «грабли» — можно траву убирать, а можно и черенком глаз высадить. :)


Плагин появился только для создания экстраполя. Без использования плагина можно все это проделать из админки самостоятельно, дальше работает механизм экстраполя file. Он вообще ничего не делает кроме создания экстраполя.

Рассуждать о потенциальных угрозах можно в теории, но на практике меня интересует ответ на один - единственный вопрос:

Для чего предназначено экстраполе file для cot_users ?

если его нельзя использовать, я просто удалю плагин который создает его и на этом закончится вопрос. 

Можно. И оно предназначено для загрузки пользователями файлов. Но ответственность за «грабли» лежит на создателе этого экстраполя. А именно какие файлы допустимы к загрузке и в какой каталог они загружаются. Статндартный каталог для хранения файлов более безопасен, чем любой другой.

Проверка на сервере решит вопрос безопасности ?

например:

если на хук extrafields.import.file.first подцепить:

global $usr;
if($usr['isadmin']){
cot_error('Вы не можете загружать проверочные файлы', $inputname);
}

Этого будет достаточно ?

В таком виде будет работать не правильно.  Дал комментарии вна гитхабе

Добавлено 10 минут спустя:

#41059 Macik:
Подводя итог, тут проблема в не правильном подходе. Для решения этой задачи, да, нужен отдельный плагин, но который берет на себя весь цикл: получение данных, обработка, хранение. Причем лучше использовать хук tools, чтобы страница ввода была в админской части.

Плагин создавался исключительно для автоматизации создания экстраполя, а дальше расчет на механизм api экстраполей, зачем мне делать отдельную страницу, писать обработчики, если смысл был именно создать экстраполе а не работать вместо него ?

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

Кстати с самого начала в описании к плагину было:

Важно:  плагин создавался из рассчета на одноразовые проверки, по принципу загрузил проверил удалил. На данный момент в нем  два поля, это значит что одновременно может быть загружено максимум два файла. 

Это значит что постоянное нахождение на сервере файла не входило в планы, а только загрузка - проверка - удаление. В том числе удаление плагина (а значит поля). 

Добавлено 1 час спустя:

==========================================

Добавил проверку , является ли пользователь админом.

Цель создания плагина указана выше - автоматическое создание экстраполя. 

Благодарю за конструктивный развернутый ответ, Macik, в любом случае информация полезная.

Всегда рад. Моя задача, как раз, не «настучать по рукам», а показать подводные камни и объяснить.

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
Roffun
#5 2015-10-04 12:42

Ну вот, теперь кажется все стало на свои места, и изначальная цель создания плагина озвучена ( мною ),

и потенциальная уязвимость при работе с экстраполями file разобрана для наглядности , с примерами и комментариями ( macik ),

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

Соответствующие правки добавлены в плагин.

Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts