Drupal Filefield不会上传javascript文件?

MrF*_*dge 6 javascript drupal drupal-6 drupal-files

我有一个网站,个别网页可能需要一些javascript或CSS文件挂在他们的头上.在管理这个过程时,我试图保持客户端的一切,而不是在代码中进行FTP和排序,所以我需要能够上传css和js文件.

我已经启动并运行CCK文件字段,它可以与css文件一起使用,但它拒绝上传.js文件.它似乎将每个.js视为".js.txt",然后该文件作为thisismyfile.js.txt显示在服务器上

不理想......

有谁知道如何解决这个问题.它是Drupal或服务器的mime类型问题,还是Drupal设置为避免脚本上传和n00b黑客攻击.

上传文件后,我打算在页面或节点上使用PHP模式来调用drupal_add_cssdrupal_add_js.

Hen*_*pel 6

在看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';
}
Run Code Online (Sandbox Code Playgroud)

所以是的,正如杰瑞米所猜测的那样,这是一个"安全的事情".

可以修补RegEx以立即"修复",但这将完全取消对该站点上使用的所有文件字段的这种有用的安全检查.

因此,更具体的解决方法可能是更好的方法.由于您希望通过drupal_add_js()代码中的调用添加文件,您可以在那里重命名,添加某种验证以确保您可以"信任"该文件(例如,谁上传它,无论如何).


编辑:关于调用时重命名(和备选方案)的选项drupal_add_js():

  • 要重命名文件,请查看该file_move()函数.这样做的一个问题是它不会更新文件表中的相应条目,因此如果移动操作成功,您也必须这样做.(文件字段只存储文件表中相应条目的'fid',因此您需要通过'fid'找到它并根据您的重命名更​​改'filename','filepath'和'filemime'条目/移动)
  • 或者,您可以只加载*.js.txt文件的内容,并使用'inline'选项添加该字符串drupal_add_js().这将不那么"优雅"并且可能会受到性能影响,但如果这些不是您特定情况下的重要标准,那么它就不那么麻烦了.
  • 另一个选择就是按原样传递*.js.txt文件drupal_add_js(),忽略'错误'扩展名.一个简短的本地测试表明这是有效的(至少在firefox中).这可能是"努力程度最低"的解决方案,但是需要一些额外的测试来解决有关"错误名称"的js文件使用的不同浏览器行为.

  • 嗯,是的,显然(并明确提到!) - 这就是为什么我把_could_用斜体字表示并推荐了一种更具体的方法.我将编辑以澄清这一点. (2认同)