Drupal Филефилд не загрузит файлы JavaScript?

Я видел этот антишаблон от людей, которые не вполне получают & операция вычисления адреса. Если они должны вызвать функцию с указателем, они будут всегда выделять на "куче", таким образом, они получат указатель.

void FeedTheDog(Dog* hungryDog);

Dog* badDog = new Dog;
FeedTheDog(badDog);
delete badDog;

Dog goodDog;
FeedTheDog(&goodDog);
6
задан kiamlaluno 21 March 2018 в 10:22
поделиться

4 ответа

Глядя на функцию field_file_save_file () в field_file.inc из модуля filefield, вы можете найти следующий фрагмент

// Rename potentially executable files, to help prevent exploits.
if (preg_match('/\.(php|pl|py|cgi|asp|js)$/i', $file->filename) && (substr($file->filename, -4) != '.txt')) {
  $file->filemime = 'text/plain';
  $file->filepath .= '.txt';
  $file->filename .= '.txt';
}

Так что да, это «вещь безопасности», как догадался Джереми.

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

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


Изменить: Относительно параметров переименования (и альтернатив) при вызове drupal_add_js () :

  • Чтобы переименовать файл, посмотрите функцию file_move () . Проблема заключается в том, что он не будет обновлять соответствующую запись в таблице файлов, поэтому вам также придется это сделать, если операция перемещения завершится успешно. (Поле файла просто хранит 'fid' соответствующей записи в таблице файлов, поэтому вам нужно будет найти его там с помощью 'fid' и изменить записи 'filename', 'filepath' и 'filemime' в соответствии с вашим переименованием / move)
  • В качестве альтернативы вы можете просто загрузить содержимое файла * .js.txt и добавить эту строку с параметром inline drupal_add_js () . Это было бы менее «элегантно» и могло бы снизить производительность, но если это не важные критерии в вашем конкретном случае, это меньше проблем.
  • Еще один вариант - просто передать файл * .js.txt как есть в drupal_add_js () , игнорируя «неправильное» расширение. Короткий локальный тест показал, что это работает (по крайней мере, в firefox). Это может быть решение «с наименьшими усилиями», но для этого потребуется дополнительное тестирование, касающееся различного поведения браузера в отношении использования «неправильно названных» js-файлов.
6
ответ дан 9 December 2019 в 20:46
поделиться

Разрешение Drupal загружать файлы javascript было бы угрозой безопасности, поэтому также и не позволяет сделать это, но вместо этого добавляет расширение .txt. Причина в том, что файлы js исполняются вместе с php, pl, py, cgi, asp. Так что, если бы Drupal мог загружать эти файлы на сервер, злоумышленники могли бы загрузить файл и запустить его, выполняя всевозможные неприятные вещи на вашем сервере, в принципе возможно все. Лучше всего найти другой способ загрузки файлов, который будет безопасным.

2
ответ дан 9 December 2019 в 20:46
поделиться

Drupal также вносит изменения в файлы javascript.Чтобы предотвратить автоматическое добавление символов подчеркивания к имени файла в Drupal, существует скрытая переменная, которая проверяется перед изменением имени файла.

Установка переменной в 1 решает проблему для меня (наряду с изменением REGEX в include / file.inc).

Я ненавижу взлом ядра, но мне это кажется плохим дизайном. Файлы Javascript не являются скриптами на стороне сервера, такими как php, py, pl, cgi и asp.

Вы можете использовать настройки разрешенных расширений файлов, чтобы предотвратить загрузку php и других серверных скриптов.

например:

variable_set ('allow_insecure_uploads', 1);

См .: http://api.drupal.org/api/function/file_munge_filename/6

0
ответ дан 9 December 2019 в 20:46
поделиться

Таким образом, загрузка файлов .js в каталог файлов практически невозможна.

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

Любые файлы js, находящиеся в каталоге файлов, будут удаляться при каждом выполнении функции drupal_clear_js_cache ().

http://api.drupal.org/api/function/drupal_clear_js_cache/6

Итак, Drupal видит файлы .js, находящиеся в каталоге загрузки файлов, как временные.

Теперь я понимаю, почему они добавляют ".txt", чтобы предотвратить их удаление при очистке кеша.

В качестве компромисса я просто буду загружать файлы .js вручную (через FTP) в папку / misc. : (

0
ответ дан 9 December 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: