2010-01-11 4 views
10

@login_required 데코레이터를 사용하고 LOGIN_URL 변수를 설정할 때 정보 누출이 발견되었습니다.Django : @login_required를 사용하고 LOGIN_URL을 설정할 때 정보 유출 문제가 발생했습니다.

모든 콘텐츠에 대해 필수 로그인이 필요한 사이트가 있습니다. 문제는 기존 페이지 일 때 다음 변수가 설정된 로그인 페이지로 리디렉션되는 것입니다. 당신이 볼

http://localhost:8000/validurl/ 

: 그래서

이와 요구 로그인하지 않은 경우이 참조

http://localhost:8000/faultyurl/ 

:

http://localhost:8000/login/?next=/validurl/ 

를하고 아닌 기존의 페이지를 요청하는 경우 :

http://localhost:8000/login/ 

내가 원하지 않는 정보가있다. 나는 로그인 메소드를 오버라이드하고, 다음을 비워 주며,이 서브 클래 싱 된 메소드에서 'super'를 호출하는 것을 고려했다.

또 다른 문제는 LOGIN_URL을 설정하지 않고 일부 테스트가 실패하는 것입니다. '/ login /'대신 '/ accounts/login /'로 리디렉션됩니다. 따라서 LOGIN_URL을 사용하고 싶지만 '다음 자동'기능을 사용하지 않도록 설정하고 싶습니다.

제목을 밝힐 수있는 사람은 누구입니까?

고맙습니다.

Gerard.

+0

은 IMO, 그 반 올바른 동작입니다. 존재하지 않는 리소스의 경우 404를, 볼 수있는 권한이 필요한 기존 리소스의 경우 403을 반환해야합니다. 다시 말해서, 존재하지 않는 것들에 대한 로그인 페이지로 향하지 않아야합니다 - 매우 베어스러운 404 페이지를 보여줍니다. –

답변

5

urls.py 파일의 마지막 패턴으로이 줄을 포함 할 수 있습니다. 다른 패턴과 일치하지 않는 URL을 로그인 페이지로 다시 라우팅합니다.

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', 'django.views.generic.simple.redirect_to', { 
     'url': '/login/?next=/%(path)s', 
     'permanent': False 
    }), 
) 

편집 : 다음을 수행, 인증 된 사용자 404 페이지를 제기 유지하려면 :

from django.http import Http404, HttpResponseRedirect 
def fake_redirect(request, path): 
    if request.user.is_authenticated: 
     raise Http404() 
    else: 
     return HttpResponseRedirect('/login/?next=/%s' % path) 

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', fake_redirect), 
) 
+0

jbochi, 흥미로운 솔루션. 그러나 이것은 제대로 로그인 한 사람들에 대한 정상적인 404 동작을 중단시킵니다. 내 맞춤 404 처리기가 얼마나 영향을 미치는지 확인해야합니다. 누군가가 로그인했는지 확인한 다음 404 또는 로그인을 결정합니다. 거기에 루프가 나타납니다. – GerardJP

+0

@GerardJP. 네가 옳아! 내 대답을 편집했습니다. 두 번째 해결 방법을 참조하십시오. 원한다면'raise Http404()'행을 수정하여 커스텀 404 핸들러를 호출 할 수있다. – jbochi

+0

jbochi, 멋지다! 그것은 내가 실제로 찾고 있었던 것입니다. 잠시 동안 내 테스트 핸들을 약간 풀고 LOGIN_URL을 사용하지 않도록 설정했는데 내 404 핸들러에서 처리했기 때문입니다. 그렇지 않으면 필자는 사용하지 않는 변수에 대한 코드를 구현할뿐입니다. 그러나 나는 '모든 것을 잡아라'라는 속임수를 기억할 것입니다. 고맙다! – GerardJP

관련 문제