2011-08-01 1 views
1

私はファイルを取得してユーザに提供するビューを持っています。ビューには、以下の通りである。セキュリティ上の問題Django URL Conf Regexに。*(ドットスター)を配置するとき

@login_required 
def file(request, mid_id, file_name): 
    user = request.user 

    authorized_mids = user.profile.authorized_mids(True) 

    mid = get_object_or_404(Mid, id=mid_id) 
    try: 
     authorized_mids[mid.id] 
    except KeyError: 
     raise Http404 

    mid_file_path = settings.PATH_TO_REPORTS + ('/%s/' % mid.pk) + file_name 

    to_return = open(mid_file_path, 'r') 

    mimetype = mimetypes.guess_type(mid_file_path) 

    response = HttpResponse(to_return, mimetype=mimetype) 
    response['Content-Disposition'] = 'attachment; filename=%s' % file_name; 

    return response 

私のURLは次のようになります。

url(r'^mid/(?P<mid_id>\d+)/file/(?P<file_name>.*?)/$', 'mid.views.file', name='fetch_report') 

持つ任意のセキュリティ上の懸念* URLではありますか。?悪意のあるユーザーがハッキングして、アクセスできないファイルにアクセスできるようになりますか?

答えて

1

URLのクエリー部分またはフラグメント部分と一致しないように、またはurllib.parseを使用してパス部分を区切るには、を[^#?]*?に置き換えてください。

また、URLの..シーケンスにも注意してください。 mid/1/fileサブディレクトリツリーの外にある

r'^mid/(?P<mid_id>\d+)/file/(?P<file_name>.*?)/$' 

マッチ

mid/1/file/../../../../etc/ 

os.path.normpath('mid/1/file/../../../../etc/') 

../etc 

ですが、あなたが$/を削除する必要がありますので、あなたは上記を拒否すべき正規表現を実行する前に、

os.path.normpath(path) 

を行うことができ、 normpathは差異を起こす可能性がありますWindowsマシンでは* nixよりも時間がかかりますurllibモジュールのnormpathに相当するものがわかりません。

関連する問題