Nhìn vào field_file_save_file()
chức năng trong field_file.inc
từ mô-đun filefield, bạn có thể tìm thấy những đoạn sau
// 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';
}
Vì vậy, có, đó là một 'an ninh điều', như Jeremy đoán.
Bạn có thể vá RegEx để sửa ngay lập tức, nhưng điều đó sẽ xóa hoàn toàn kiểm tra bảo mật hữu ích này cho tất cả các trường tệp được sử dụng trên trang web.
Vì vậy, cách giải quyết cụ thể hơn có thể là cách tiếp cận tốt hơn. Vì bạn muốn thêm các tệp qua drupal_add_js()
cuộc gọi từ mã anyways, bạn cũng có thể thực hiện đổi tên ở đó, thêm một số loại xác minh để đảm bảo bạn có thể 'tin tưởng' tệp (ví dụ: ai đã tải lên tệp đó, bất kỳ điều gì).
Edit: tùy chọn Về để đổi tên (và thay thế) khi gọi drupal_add_js()
:
- Đối đổi tên tập tin, nhìn vào
file_move()
chức năng. Một vấn đề với điều này sẽ được rằng nó sẽ không cập nhật các mục tương ứng trong bảng tập tin, vì vậy bạn sẽ phải làm điều đó cũng có, nếu hoạt động di chuyển thành công. (Trường tệp chỉ lưu trữ 'fid' của mục tương ứng trong bảng tệp, vì vậy bạn cần tìm nó ở đó bằng 'fid' và thay đổi các mục nhập 'filename', 'filepath' và 'filemime' theo tên của bạn/move)
- Ngoài ra, bạn chỉ có thể tải nội dung của tệp * .js.txt và thêm chuỗi đó với tùy chọn 'nội tuyến' là
drupal_add_js()
. Điều này sẽ ít 'thanh lịch' và có thể là một hit hiệu suất, nhưng nếu đó không phải là tiêu chí quan trọng trong trường hợp cụ thể của bạn, thì sẽ ít rắc rối hơn.
- Một tùy chọn khác sẽ là chỉ cần chuyển tệp * .js.txt như là
drupal_add_js()
, bỏ qua phần mở rộng 'sai'. Một thử nghiệm địa phương ngắn cho thấy rằng công trình này (ít nhất là trong firefox). Đây có thể là giải pháp 'ít nỗ lực nhất', nhưng sẽ cần một số thử nghiệm bổ sung liên quan đến hành vi trình duyệt khác nhau liên quan đến việc sử dụng tệp js 'bị đặt tên sai'.
Nguồn
2009-09-04 10:07:19
Khi đoán đó là điều bảo mật. –