2012-03-31 5 views
10

이 질문은 코드 작성 방법에 관한 직접적인 보험보다 재보험입니다. autodidact로서 나는 전문가에게 그런 것들을 요청할 많은 가능성이 없었기 때문에 여기에서 시도한다.어떤 경우 CSRF 면제가 위험 할 수 있습니까?

나는 장고 - 문서의 문서 (https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/) 및 해당 페이지에 대한 몇 가지 정보를 읽고 : http://cwe.mitre.org/top25/#CWE-352

는 지금까지 내가 이해 한대로, 장고가에 토큰 (핀 코드의 일종)를 제공 사용자. 그리고 실제로 그 사람임을 확인하기 위해, 그는 다음에 요청할 때 그것을 돌려 주어야합니다. 그리고 Google의 몇몇 사람들은 아약스 요청으로도 이것이 가능하다는 것을 알았습니다. 따라서 우리는 1.2.6 이후에도 새로운 정책을 보호해야합니다. 그리고 CSRF는 다른 누군가 인 것처럼 보이는 (악성 코드, 위험한 코드, 손상된 파일 등) 누군가에게 내 정보를 제공하는 것에 관한 것입니다.

그래서 나는이 같은 일부 코드가있는 경우 : 내가 지정된 값을 변환하기 전에 데이터베이스 또는 내 응용 프로그램의 어떤 부분에 대한 액세스 권한을 포기하지 않을거야으로 저장해야합니다

@csrf_exempt  
def grab(request): 
    """ 
    view to download an item 
    POST because it stores that a user has downloaded this item 
    """ 
    item_id = request.POST.get('item', None) 
    if not loop: return HttpResponseBadRequest('no item id provided') 
    item = Item.objects.get(pk=int(item_id)) 

정수. 파일을 다운로드하는 사람의 기록을 잘못하면 너무 많은 피해를 입지 않습니다 (이 경우 거의 없습니다). 나는이 견해에 의존하는 법안을 작성한다고 가정 할 때, CSRF 면제는 다양하고 나쁜 생각 일 것입니다 (맞습니까?). 누군가가 사용자로부터 CSRF 토큰을 훔쳐 아직도 날 (또는 사용자) 트릭을 사용할 수없는 이유를

는 또한 이해가 안 돼요. 그래서이 주제에 대해 몇 가지 질문이 있습니다 :

1) 위의 내 가정은 무엇입니까?

2) 누군가가 말해 줄 수, 무엇을 (그리고 몇몇 그리 좋은 사람이 더러운 트릭을 할 수 위의보기를 사용할 수 있습니다 아마도 방법), 그리고 그들이 무엇을 할 것인가? CSRF는 man-in-the-middle 공격, 그것은 단지 관련이의 예

3), 또는 그것은 완전히 다른 뭔가?

4) 이러한 위험에 대해 더 자세히 읽어 보려면 귀중한 링크가 필요합니까?

어쩌면이 질문 중 일부는 너무 잘 알려지지는 않지만 나는 그 문제를 해결하려고합니다. 누군가가 나를 도울 수 있다면 정말 기뻐할 것입니다.

답변

9

CSRF attacks 위조 요청을 보낼 피해자 브라우저를 강제하려고합니다. 간단한 <img> 또는 GET 및 POST 방법 모두에 대해 <form>을 자동으로 제출하면 충분합니다. 그리고 요청은 브라우저에 의해 보내지기 때문에 인증 자격 증명을 보내고 요청이 서버의 관점에서 본격적이고 합법적 인 것처럼 보입니다. 기본적으로 사용자 동작에 의해 시작된 요청과 다르지 않기 때문입니다.

그리고는 CSRF 토큰이 사용됩니다 정확히 무엇 : 타사 사이트에서 위조 된 자들을 사용자에 의해 시작되었고 요청 사이의 차이를 설정합니다. 이 목적을 위해 CSRF 토큰은 서버와 사용자에게만 알려진 비밀 정보로 작동합니다. 서버는 문서의 비밀을 응답으로 넣고 다음 요청에서 다시 전송할 것으로 예상합니다.

비밀이이 특정 사용자에게 할당 된 응답 문서에 포함되어 있기 때문에 공격자는 특정 응답을 도청하거나 다른 방식으로 문서에 액세스해야합니다. 확실히 공격이 CSRF 토큰을 얻습니다 (예 : eavesdropping, MITM, XSS 등). 그러나 그러한 공격으로부터 보호받는다면 공격자는 확실한 요청을 할 수 없습니다.

+0

터널 끝 부분에 희미한 빛이 나타납니다. 따라서 서버에 악의적 인 것을 보내려면 먼저 일부 사용자 브라우저에 데이터를 보내야합니다. 이 데이터에서 공격받을 서버에 보내는 자동으로 게시되는 양식을 숨 깁니다. 나는 거기에 계좌를 가지고 있기 때문에 그 서버에 사용자가 로그인했다고 가정한다. 서버가 토큰을 확인하지 않으면 요청이 합법적이라고 믿어야합니다. 적어도 나는 그것이 어떻게 작동하는지, 그리고 MIM과 XSS에 선을 그릴 위치에 대해 생각해 봤다. 고마워. – marue

+0

@marue CSRF는 악성 데이터를 서버로 보내는 것이 아닙니다. 주로 공격 사이트가 피해자를 대신하여 합법적이고 실제적인 요청을 보낼 수 있으므로 가장 (impersonation)입니다. 도청, MITM 및 XSS는 완화 된 CSRF 토큰을 파악하는 수단 일뿐입니다 (대부분의 인증 관리 체계는 쿠키 기반 세션을 사용하기 때문에 세션 ID를 얻을 수도 있습니다). – Gumbo

+0

그래서 CSRF는 당신이 아닌 다른 사람인 척하는 "유일한"것입니까? 중요하지 않은 것은 아니지만 다른 모든 것은 다른 공격 경로입니다. – marue

6

나는 (당신은 아마도 몇 가지 권한이) 다른 사이트에 내가 (일반적으로 img 또는 form를 통해 요청) 몇 가지 코드를 삽입 된 웹 페이지를 볼로 당신을 속여

CSRF 공격.

무해한 예는

<img src="http://www.yoursite.net/changelanguage?lang=fr"> 

나는 잔인하게 프랑스어로 세션의 언어를 변경했습니다. Oh noes! csrf 보호를 안전하게 제거하고 db 히트를 저장할 수 있습니다.

위험 예 당신이 yourbank.net에 로그인 한 (그리고 더 CSRF 또는 기타 보호가없는) 경우

<img src="http://www.yourbank.net/sendmoney?amt=9999&account=123> 

는 귀하의 계정이 지금 쯤은 가벼운 느낌을한다. 당신이 관리자로 yoursite.net에 로그인한다면 우리 모두는,

<img src="http://www.yoursite.net/admin/users/123/edit?admin=1"> 

(나는 123이다). (나는 123입니다.)

+1

이 예를 갖는 데 큰 도움이됩니다. 감사합니다. – marue