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

1097
Многие хостинги используют в файловой системе каталог 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 код:
Код PHP:
  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. }
Заменяем на:
Код PHP:
  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. }
Вуаля! всё работает :)

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

Всем хорошего настроения!
Новая версия шаблона PORTAL | Адаптивный шаблон - форумы
Комментарии (6)
lokanaft 11 сентября 2013 в 14:40 -1
А также: .php4, .php5, .htm, .mht, .htaccess ну и другие всякие разные)
Fuze 11 сентября 2013 в 15:33 +4
В дистрибутиве в разделе "скачать" такой проблемы нет

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