javascript - Drupal Filefield 不会上传 javascript 文件?

标签 javascript drupal drupal-6 drupal-files

我有一个站点,其中各个页面可能需要一些 javascript 或 CSS 文件连接到它们的头部。在管理此过程时,我试图将所有内容都保留在客户端,而不是使用 FTP 并在代码中整理所有内容,因此我需要能够上传 css 和 js 文件。

我已经启动并运行了 CCK filefield,它可以处理 css 文件,但它拒绝上传 .js 文件。相反,它似乎将每个 .js 视为“.js.txt”,然后文件在服务器上显示为 thisismyfile.js.txt

不理想...

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

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

最佳答案

查看 filefield 模块 field_file.inc 中的 field_file_save_file() 函数,您可以找到以下代码片段

// 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';
}

所以是的,正如 Jeremy 猜测的那样,这是一个“安全问题”。

可以修补该 RegEx 以立即“修复”,但这将完全删除该站点上使用的所有文件字段的有用安全检查。

因此,更具体的解决方法可能是更好的方法。由于无论如何你都想通过代码中的 drupal_add_js() 调用添加文件,你不妨在那里进行重命名,添加某种验证以确保你可以“信任”该文件(例如谁上传它,无论如何)。


编辑:关于调用 drupal_add_js() 时重命名(和替代)的选项:

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

关于javascript - Drupal Filefield 不会上传 javascript 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378246/

相关文章:

javascript - 数据库的表组织

javascript - jQuery:迭代中的索引切片函数

mysql - 如何追踪 Drupal max_allowed_pa​​cket 错误?

Drupal View 寻呼机

drupal - 如何延迟电子邮件递送?

javascript - 更新对象数组中的单个对象键值 react redux 状态

javascript - 如何为给定数组创建跨度列表

drupal - 如果我使用 Paypal 标准付款,我的网站是否需要 SSL 层?

css - 德鲁帕尔 6 : defining js and css for particular pages

drupal - 默认情况下折叠节点表单上的分类法字段集