2016-07-07 15 views
6

Tôi vẫn chưa rõ khi nào sử dụng send_file và khi send_from_directory.Bình - Khi nào sử dụng send_file/send_from_directory

Tôi có một tệp trong thư mục được bảo vệ. Tôi có thể truy cập tập tin từ cả hai phương pháp. Vì vậy, có lẽ ai đó có một ví dụ làm rõ chức năng nào nên được sử dụng.

@app.route('/sfile/<id>') 
def sfile(id=None): 

    try: 
     return send_file('protected/'+id, attachment_filename='python.jpg') 
    except: 
     return('') 

@app.route('/sdir/<path:filename>') 
def sdir(filename): 
    try: 
     return send_from_directory(
      os.path.join(app.instance_path, ''), 
      filename 
     ) 
    except: 
     return '' 

Trả lời

11

send_file là chức năng xử lý việc gửi tệp cho người dùng. Nó không kiểm tra san bằng đầu vào, vì vậy nó cũng sẽ vui vẻ gửi protected/../../../etc/passwd hoặc bất cứ điều gì. Trong trường hợp cụ thể của bạn có thể không hoạt động, nhưng nếu bạn không biết về kiểu tấn công đó, bạn có thể tạo ra mã không an toàn.

send_from_directory kiểm tra xem tệp được yêu cầu có thực sự là từ thư mục được chỉ định hay không. Bằng cách đó cuộc tấn công trên sẽ không hoạt động.

Vì vậy, bạn có thể sử dụng send_file khi chỉnh sửa tệp nhập liệu được tin cậy. Điều đó có nghĩa là thực hiện kiểm tra của riêng bạn hoặc nếu đầu vào được cung cấp bởi bạn (ví dụ: my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input]) sẽ không sao) bạn sẽ ổn. Đối với trường hợp phổ biến, send_from_directory là một hàm trợ giúp thực hiện kiểm tra bảo mật thích hợp.

+0

cảm ơn rất nhiều vì lời giải thích – Alex

Các vấn đề liên quan