6

個々のページのヘッドにフックされた javascript または CSS ファイルが必要なサイトがあります。このプロセスの管理に関しては、FTP にアクセスしてコード内のすべてを整理するのではなく、すべてをクライアント側に保持しようとしているので、css および js ファイルをアップロードできるようにする必要があります。

私は CCK filefield を稼働させており、css ファイルで動作しますが、.js ファイルのアップロードを拒否します。代わりに、すべての .js を「.js.txt」として表示するように見え、ファイルはサーバー上に thisismyfile.js.txt として表示されます。

理想的ではない...

誰でもこれを回避する方法を知っていますか。Drupal やサーバーの MIME タイプの問題なのか、Drupal がスクリプトのアップロードや n00b ハック攻撃を回避するように設定されているのか。

ファイルがアップロードされたら、ページまたはノードで PHP モードを使用してdrupal_add_cssおよびdrupal_add_jsを呼び出すつもりです。

4

6 に答える 6

6

from filefield モジュールのfield_file_save_file()関数を見ると、次のスニペットが見つかります。field_file.inc

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

そうです、ジェレミーが推測したように、それは「セキュリティの問題」です。

その正規表現にパッチを適用して即時の「修正」を行うこともできますが、サイトで使用されるすべてのファイルフィールドに対して、そうでなければ便利なこのセキュリティ チェックが完全に削除されます。

したがって、より具体的な回避策がより良いアプローチになる可能性があります。とにかくコードからの呼び出しでファイルを追加したいのでdrupal_add_js()、そこで名前を変更し、ファイルを「信頼」できることを確認するための何らかの検証を追加することもできます(たとえば、誰がアップロードしたかなど)。


編集:呼び出し時の名前の変更(および代替)のオプションについてdrupal_add_js()

  • ファイルの名前を変更するには、file_move()関数を調べます。これに関する問題は、ファイル テーブル内の対応するエントリが更新されないことです。そのため、移動操作が成功した場合は、それも行う必要があります。(filefield は、対応するエントリの 'fid' をファイル テーブルに格納するだけなので、'fid' で検索し、名前変更に従って 'filename'、'filepath' および 'filemime' エントリを変更する必要があります。 /動く)
  • または、 *.js.txt ファイルのコンテンツをロードし、その文字列を 'inline' オプションで追加することもできますdrupal_add_js()。これは「エレガント」ではなく、パフォーマンスに影響を与える可能性がありますが、特定のケースでそれらが重要な基準ではない場合、問題は少なくなります。
  • さらに別のオプションは、*.js.txt ファイルをそのまま に渡しdrupal_add_js()、「間違った」拡張子を無視することです。短いローカル テストでは、これが機能することが示されました (少なくとも Firefox では)。これは「最小限の労力」の解決策かもしれませんが、「誤った名前の」js ファイルの使用に関するさまざまなブラウザーの動作に関する追加のテストが必要です。
于 2009-09-04T10:07:19.967 に答える
2

Drupal に JavaScript ファイルのアップロードを許可すると、セキュリティ リスクが発生します。これが、Drupal が許可しない理由でもありますが、代わりに .txt 拡張子を追加します。その理由は、js ファイルが php、pl、py、cgi、asp と一緒に実行可能だからです。したがって、Drupal がこれらのファイルをサーバーにアップロードできれば、悪意のある者がファイルをアップロードして実行し、サーバー上であらゆる種類の厄介なことを実行することが可能になります。基本的には何でも可能です。最善の方法は、安全なファイルをアップロードする別の方法を見つけることです。

于 2009-09-04T11:09:25.207 に答える
2

同様の必要性があり、hook_install で次のコード行を実行して、最初に 'allow_insecure_uploads' 変数の値を変更することにより、セキュリティを回避する方法を見つけました。

 variable_set('allow_insecure_uploads', 1);

次に、モジュールにこの関数を追加します

/**
 * 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);
}

これが行うことは、hook_insert 呼び出しで、ファイルに拡張子「.js.txt」があるかどうかを確認することです。その場合、それを新しい場所にコピーし、名前を変更します。これはセキュリティチェック後なので問題ありません。files/js ディレクトリに配置しない限り、js ファイルを削除するキャッシュ クリアについて心配する必要はないと思います。モジュール用に独自のディレクトリを作成すれば、問題ありません。

于 2010-09-16T22:03:57.543 に答える
2

特定のフィールドに対して.jsファイルをそのまま(.txtなしで「application/javascript」MIMEタイプを使用)アップロードできるようにしたいときに、この状況に直面しました。また、私は Drupal コアを変更したくありませんでした... もちろん。

そのため、hook_file_presave() を実装するモジュールを作成する必要がありました。フックが on であるため、これは Multiupload File Widget でも機能しfile_save()ます。

MYMODULE_NAMEandMYFIELD_NAMEを独自の値に置き換える必要があることに注意してください。

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)));
    }
}
于 2014-07-31T20:26:11.237 に答える
0

Drupal はまた、javascript ファイルを「マンジ」します。Drupal がファイル名にアンダースコアを自動的に追加するのを防ぐために、ファイル名が「変更」される前にチェックされる隠し変数があります。

変数を 1 に設定すると、(includes/file.inc の REGEX を変更すると共に) 問題が解決します。

私はコアをハッキングするのは嫌いですが、これは私には貧弱な設計のように思えます。Javascript ファイルは、php、py、pl、cgi、asp などのサーバー側スクリプトではありません。

許可されたファイル拡張子の設定を使用して、php およびその他のサーバー側スクリプトがアップロードされないようにすることができます。

例えば:

variable_set('allow_insecure_uploads', 1);

参照: http://api.drupal.org/api/function/file_munge_filename/6

于 2010-03-22T02:33:49.393 に答える
0

そのため、ファイル ディレクトリに .js ファイルをアップロードすることはほとんど不可能です。

.js ファイルを正常にアップロードできたとしても、これらのファイルはキャッシュがクリアされると削除されます。

files ディレクトリ内にある js ファイルは、drupal_clear_js_cache() 関数が実行されるたびに削除されます。

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

そのため、Drupal は、ファイル アップロード ディレクトリにある .js ファイルを一時ファイルとして認識します。

「.txt」を追加する理由がわかりました。キャッシュがクリアされたときに削除されないようにするためです。

したがって、妥協案として、.js ファイルを手動で (FTP 経由で) /misc フォルダーにアップロードすることになると思います。:(

于 2010-03-22T16:45:22.700 に答える