Как заинклудить php-шку на одной определенной странице?

InstantCMS 2.X
#16 20 февраля 2022 в 18:02

что будет, если я на сайте example.com размещу файл example.com/php.js

IamB

Это сырой набросок одного файла, здесь уже по вашему желанию в строке 16 регулярными выражениями, можете разрешить, запретить всё что угодно. В первой ветке есть папка myphp, на одном из моих сайтов находятся около 20 файлов, 10 лет всё нормально. Данное поле нужно только для вебмастера, доступ сторонних пользователей к нему должен закрыт! (описывать как закрыть доступ к созданию и редактированию контента вы знаете), мне оно нужно для работы с  API Яндекса.

P.S. Это просто набросок файла для поля «Добавить файл PHP», по его принципу можно легко переделать поле «Файл» и тогда оно станет универсальным.

#17 20 февраля 2022 в 19:52

 Nikolay, я ни в коем случае не противник набросков. Но поскольку большинство пользователей этого форума любят по-быстрому сделать ctrl+c, ctrl+v и не склонны к анализу кода, я и указал на возможный вектор атаки при бездумном использовании вашего кода.

#18 20 февраля 2022 в 20:42

о поскольку большинство пользователей этого форума любят по-быстрому сделать ctrl+c, ctrl+v и не склонны к анализу кода

IamB

Поэтому один файл и без второго он работать не будет

на возможный вектор атаки при бездумном использовании вашего кода

IamB

Бездумно не получиться у тех кто не хочет создать второй файл

Сегодня в 00:16
#19 21 февраля 2022 в 18:46

В качестве дополнительной защиты можно добавить в настройку строку «папка с php файлами», а в поле $value разрешить только имя файла (без слешей), и выводить по составному пути

  1. return '<div class="add_files">' . @file_get_contents ($php_folder.$value, false) . '</div>';
#20 21 февраля 2022 в 20:11

Хотелось бы ещё убрать собачку перед file_get_contents, к примеру если добавляем ссылку на не существующий файл, то выводилась надпись — Не верный путь к файлу, без собачки идут нотисы. Как это реализовать, то времени нет рыть инет.

#21 21 февраля 2022 в 22:43

require, include, require_once и include_once с ними не получилось указать путь к файлу, перебрал много способов, но у вы.

Nikolay

Попробуйте так

  1. public function parse($value) {
  2.  
  3. if ($value === "") {
  4. return "";
  5. }
  6.  
  7. $path = PATH.$value;
  8.  
  9. if (file_exists($path)) {
  10. include $path;
  11. $out = ob_get_clean();
  12. return '<div class="add_files">'.$out.'</div>';
  13. } else {
  14. return 'Указана неверная ссылка';
  15. }
  16.  
  17. }

$value должно быть записано, например, так

/templates/custom/hw.php

#22 21 февраля 2022 в 23:08

Попробуйте так

IamB

Код не сработал выдал ошибку: Parse error: syntax error, unexpected end of file, expecting function (T_FUNCTION) or const (T_CONST)

#23 22 февраля 2022 в 15:49

У меня работает, не знаю как вам удалось заполучить такую ошибку, не понятно также, где она произошла. Я вам показал как метод parse() переписать, остальной ваш код никто не отменял.

Плюс моей реализации кроме прочего  в том, что в подключаемом файле доступен функционал CMS. В файле  /templates/custom/hw.php (см. пример выше)  работает такой код

  1. <?php
  2. $user = cmsUser::getInstance();
  3. echo "Hello, {$user->nickname}!";
#24 22 февраля 2022 в 18:23

У меня работает, не знаю как вам удалось заполучить такую ошибку

IamB

Очень просто, вместо фигурной скобки поставил круглую. По вашему мнению, как лучше делать с буферизацией или без неё.

#25 22 февраля 2022 в 18:59

Вариант с file_get_contents() организует отдельный get-запрос к серверу, т.е. запускается web-сервер, он запускает интерпретатор php, php файл выполняется и web-сервер отдает результат, этот результат «ловит» file_get_contents(). Это затратный способ, к тому же в этом варианте вы имеете автономный скрипт — у него нет доступа к функционалу CMS. Я выбрал бы «буферизацию». 

#26 22 февраля 2022 в 19:30

Я выбрал бы «буферизацию».

IamB

Выбираю ваш вариант, создам папку в дочерней теме и ни кому она не мешает.

#27 Вчера в 17:10

Прошло три года пришлось вернуться к данной теме, чтоб вывести код на одном из сайтов. Что произошло за три года все круто изменилось, прогресс растет: попросил кореша «проверь код», а он пожалуйста — выдал ответ:

  1. <?php
  2.  
  3. class fieldAdfiles extends cmsFormField {
  4.  
  5. public $title = 'Добавить файл PHP';
  6. public $sql = 'varchar(200) NULL DEFAULT NULL';
  7. public $filter_type = false;
  8. public $var_type = false;
  9.  
  10. /**
  11.   * Parses the value and includes the PHP file if it exists.
  12.   *
  13.   * @param string $value The path to the PHP file.
  14.   * @return string The HTML output or an error message.
  15.   */
  16. public function parse($value) {
  17. // Return empty string if the value is empty
  18. if ($value === "") {
  19. return "";
  20. }
  21.  
  22. // Construct the full path to the file
  23. $path = PATH . $value;
  24.  
  25. // Check if the file exists
  26. if (file_exists($path)) {
  27. // Start output buffering
  28. // Include the PHP file
  29. include $path;
  30. // Get the buffered output and clean the buffer
  31. $out = ob_get_clean();
  32. // Return the output wrapped in a div
  33. return '<div class="add_files">' . $out . '</div>';
  34. } else {
  35. // Return an error message if the file does not exist
  36. return 'Указана неверная ссылка';
  37. }
  38. }
  39. }
  40.  

  Говорю ему добавь защиту, а он не возражает:

  1. <?php
  2.  
  3. class fieldAdfiles extends cmsFormField {
  4.  
  5. public $title = 'Добавить файл PHP';
  6. public $sql = 'varchar(200) NULL DEFAULT NULL';
  7. public $filter_type = false;
  8. public $var_type = false;
  9.  
  10. public function parse($value) {
  11. if (!$value) {
  12. return '';
  13. }
  14.  
  15. $path = PATH . $value;
  16.  
  17. if (file_exists($path) && pathinfo($path, PATHINFO_EXTENSION) === 'php') {
  18. include $path;
  19. $out = ob_get_clean();
  20. return '<div class="add_files">' . $out . '</div>';
  21. } else {
  22. return 'Указана неверная ссылка';
  23. }
  24. }
  25. }
  26.  

  Вот думаю как его ещё можно напрячь?

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