Устранение проблемы в core/cms.php для 1.10.2

+19
1.38K
Многие хостинги используют в файловой системе каталог public_html и он обязательно входит в путь загрузки файлов. В 1.10.2 с этим проблема. То есть проблема в функции cmsCore::moveUploadedFile.
Сейчас берётся путь, по которому собираются загрузить картинку, например /home/akkaunt/public_html/site.ru/images/photos/article123.jpg и вырезают из него на всякий случай все упоминания подстрок: htm, php, ht, ну, типа, чтобы никто не мог загрузить на сервер файлы *.html, *.php.
В результате, public_html в пути заменяется на public_l и, разумеется, ничего не загружается: ни фото к статье, ни фото в альбомы. Причём, это касается не только загрузки картинок, но, и вообще любых загрузок, осуществляемых через instantcms.
Поправил это так:
Файл core/cms.php со строки 1806 код:
  1. while (mb_strpos($destination, 'htm') ||
  2. mb_strpos($destination, 'php') ||
  3. mb_strpos($destination, 'ht')) {
  4. $destination = str_ireplace(array('htm','php','ht'), '', $destination);
  5. }
Заменяем на:
  1. while (true)
  2. {
  3. $orig = $destination;
  4. $destination = preg_replace('/\.php$/', '', $destination);
  5. $destination = preg_replace('/\.html?$/', '', $destination);
  6. if ($orig == $destination)
  7. break;
  8. }
Вуаля! всё работает :)

Можно скачать исправленный файл.

Всем хорошего настроения!
-1
lokanaft lokanaft 8 лет назад #
А также: .php4, .php5, .htm, .mht, .htaccess ну и другие всякие разные)
+4
Fuze Fuze 8 лет назад #
В дистрибутиве в разделе "скачать" такой проблемы нет

Код PHP:
  1. if($errorCode !== UPLOAD_ERR_OK && isset($uploadErrors[$errorCode])){
  2. $_SESSION['file_upload_error'] = $uploadErrors[$errorCode];
  3. return false;
  4. } else {
  5. $_SESSION['file_upload_error'] = '';
  6. $upload_dir = dirname($destination);
  7. if (!is_writable($upload_dir)){ @chmod($upload_dir, 0777); }
  8. $pi = pathinfo($destination);
  9. while (mb_strpos($pi['basename'], 'htm') ||
  10. mb_strpos($pi['basename'], 'php') ||
  11. mb_strpos($pi['basename'], 'ht')) {
  12. $pi['basename'] = str_ireplace(array('htm','php','ht'), '', $pi['basename']);
  13. }
  14. $destination = $pi['dirname'] .DIRECTORY_SEPARATOR. $pi['basename'];
  15. return @move_uploaded_file($source, $destination);
  16. }
+3
Олег с клещами Олег с клещами 8 лет назад #
Ну вот, а я мучался :)
+2
Amurland Amurland 8 лет назад #
Тоже нашёл такую, но сначала написал Fuze, мне ответили тоже самое joke Лучше иногда поинтересоваться v
+1
kirkr kirkr 8 лет назад #
Скачал, нифига пришлось также искать и менять, перепроверь архив который только ПАТЧ.
0
Роман Роман 8 лет назад #
Код PHP:
  1. $pi['basename'] = str_ireplace(array('htm','php','ht'), '', $pi['basename']);
  2. }
  3. $destination = $pi['dirname'] .DIRECTORY_SEPARATOR. $pi['basename'];
  4. return @move_uploaded_file($source, $destination);
у меня такое в этой строке:(

Еще от автора

Добавление материалов гостями без регистраци
Много предлагалось способов как разрешить гостям добавлять материалы. Перепробовал все, на сегодня ни один не работает. Пришлось изобрести велосипед.
Фиктивный счетчик клиентов
Иногда требуется вывести на сайте фиктивный счетчик клиентов. Я люблю максимально простые решения.
Вставка из Word в CKEditor 1.хх
Не раз уже на форуме обсуждали проблемку в CKEditor когда нельзя вставить текст из Word (нет кнопки). Решения я не увидел, поэтому полез сам
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.