2016-07-07 2 views
6

send_file을 사용할 때와 send_from_directory을 사용할 때 여전히 확실하지 않습니다.플라스크 - send_file/send_from_directory를 사용할 때

보호 된 폴더에 파일이 있습니다. 두 방법 모두에서 파일에 액세스 할 수 있습니다. 그래서 누군가는 어떤 함수가 사용되어야하는지 명확하게하는 예제를 가지고있을 것입니다.

@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 '' 

답변

11

send_file은 파일 전송을 사용자에게 처리하는 기능입니다. 그것은 입력에 온 전성 체크를하지 않으므로 행복하게 protected/../../../etc/passwd 또는 무엇이든 보내 줄 것입니다. 특정 경우에는 작동하지 않을 수도 있지만, 그런 유형의 공격을 인식하지 못하면 안전하지 않은 코드가 생성 될 수 있습니다.

send_from_directory은 요청한 파일이 실제로 지정된 디렉토리에 있는지 확인합니다. 그렇게하면 위의 공격이 작동하지 않습니다.

따라서 입력 파일 경로가 신뢰할 수있는 경우 send_file을 사용할 수 있습니다. 즉, 자신의 수표를 사용하거나 입력이 사용자가 제공 한 경우 (예 : my_file_paths = {"a": "path/to/a", ... }; send_file(my_file_paths[user_input])) 괜찮을 것입니다. 일반적인 경우 send_from_directory은 적절한 보안 검사를 수행하는 도우미 함수입니다.

+0

설명에 감사드립니다. – Alex