Tengo un sitio donde las páginas individuales pueden requerir algunos archivos JavaScript o CSS enganchados en sus cabezas. Estoy tratando de mantener todo el lado del cliente cuando se trata de administrar este proceso, en lugar de acceder al FTP y ordenar todo en el código, por lo que necesito poder cargar archivos css y js.

Tengo el campo de archivos CCK en funcionamiento, y funciona con archivos css, pero se niega a cargar archivos .js. En cambio, parece ver todos los archivos .js como ".js.txt" y luego el archivo aparece en el servidor como thisismyfile.js.txt

No es ideal...

¿Alguien sabe cómo solucionar esto? ¿Es un problema de tipo mime con Drupal o el servidor, o está configurado Drupal para evitar la carga de scripts y ataques de pirateo n00b?

Una vez que se cargan los archivos, pretendo usar el modo PHP en la página o nodo para llamar a drupal_add_css y drupal_add_js.

6
MrFidge 4 sep. 2009 a las 13:46

5 respuestas

Por lo tanto, cargar archivos .js en el directorio de archivos es prácticamente imposible.

Incluso si logras que los archivos .js se carguen limpiamente, estos archivos se eliminarán cuando se borre el caché.

Cualquier archivo js que viva dentro del directorio de archivos se eliminará cada vez que se ejecute la función drupal_clear_js_cache ().

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

Entonces Drupal ve los archivos .js que viven en el directorio de carga de archivos como temporales.

Ahora entiendo por qué están agregando ".txt", es para evitar que se eliminen cuando se borra el caché.

Entonces, como compromiso, supongo que solo subiré archivos .js manualmente (a través de FTP) a la carpeta / misc. :(

0
speedytwenty 22 mar. 2010 a las 16:45

Drupal también "munges" archivos javascript. Para evitar que Drupal agregue automáticamente guiones bajos al nombre de archivo, hay una variable oculta que se verifica antes de que el nombre de archivo se "modifique".

Establecer la variable en 1 me resuelve el problema (junto con alterar el REGEX en include / file.inc).

Odio hackear core, pero esto me parece un mal diseño. Los archivos Javascript no son scripts del lado del servidor como php, py, pl, cgi y asp.

Puede usar la configuración de extensiones de archivo permitidas para evitar que se carguen PHP y otros scripts del lado del servidor.

Eg:

Variable_set ('allow_insecure_uploads', 1);

Ver: http://api.drupal.org/api/function/file_munge_filename/6

0
speedytwenty 22 mar. 2010 a las 03:13

Me enfrenté a esta situación cuando quería permitir que el archivo .js se cargara tal cual (sin .txt y con el tipo mime 'application / javascript') para un campo específico. Además, no quería alterar el núcleo de Drupal ... por supuesto.

Entonces necesitaba crear un módulo implementando hook_file_presave (). Esto también funciona para Multiupload File Widget, ya que su enlace está en file_save().

Tenga en cuenta que debería reemplazar MYMODULE_NAME y MYFIELD_NAME por sus propios valores.

function MYMODULE_NAME_file_presave($file) {

    // Bypass secure file extension for .js for field_additional_js field only
    if((isset($file->source) && strpos($file->source, "MYFIELD_NAME") !== FALSE) && substr($file->filename, strlen($file->filename) - 7) == ".js.txt") {

        // Define new uri and save previous
        $original_uri = $file->uri;
        $new_uri = substr($file->destination, null, -4);

        // Alter file object
        $file->filemime = 'application/javascript';
        $file->filename = substr($file->filename, null, -4);
        $file->destination = file_destination($new_uri, FILE_EXISTS_RENAME);
        $file->uri = $file->destination;

        // Move fil (to remove .txt)
        file_unmanaged_move($original_uri, $file->destination);

        // Display message that says that
        drupal_set_message(t('Security bypassed for .js for this specific field (%f).', array('%f' => $file->filename)));
    }
}
2
jmcouillard 31 jul. 2015 a las 20:32

Tenía una necesidad similar, y encontré una forma de sortear la seguridad cambiando primero el valor de la variable 'allow_insecure_uploads' ejecutando esta línea de código en su hook_install:

 variable_set('allow_insecure_uploads', 1);

Luego, en un módulo, agregue esta función

/**
 * Implementation of FileField's hook_file_insert().
 */
function MODULE_NAME_file_insert(&$file) {
  //look for files with the extenstion .js.txt and rename them to just .js
  if(substr($file->filename, -7) == '.js.txt'){
  $file_path = $file->filepath;
  $new_file_path = substr($file_path, 0, strlen($file_path)-4);
  file_move($file_path, $new_file_path);

  $file->filepath = $file_path;
  $file->filename = substr($file->filename, 0, strlen($file->filename)-4);
  $file->filemime = file_get_mimetype($file->filename);
  $file->destination = $file->filepath;
  $file->status = FILE_STATUS_TEMPORARY;
  drupal_write_record('files', $file);
}

Lo que esto hace es en la llamada hook_insert, comprueba si un archivo tiene la extensión ".js.txt". Si lo hace, lo copia a una nueva ubicación y lo renombra. Esto es después del control de seguridad, así que está bien. No creo que deba preocuparse de que la memoria caché borre los archivos js siempre que no los coloque en el directorio files / js. Cree su propio directorio para su módulo y debería estar bien.

2
Mike Dorrell 16 sep. 2010 a las 22:03

Permitir que Drupal cargue archivos javascript sería un riesgo de seguridad, razón por la cual no le permite hacerlo, sino que agrega la extensión .txt. La razón es que los archivos js son ejecutables junto con php, pl, py, cgi, asp. Entonces, si Drupal pudiera subir esos archivos al servidor, sería posible que los malhechores subieran un archivo y lo ejecutaran haciendo todo tipo de cosas desagradables en su servidor, básicamente todo es posible. Lo mejor sería encontrar una forma diferente de cargar archivos que sean seguros.

2
googletorp 4 sep. 2009 a las 11:09