2012-11-25 2 views
1

내가 웹 사이트에 로그인 requests를 사용하려고하지만 당신은 내가 여기에 문제가파이썬은 403

을 가진 내가

import requests 

EMAIL = '***' 
PASSWORD = '***' 
URL = 'https://portal.bitcasa.com/login' 

client = requests.session(config={'verbose': sys.stderr}) 
login_data = {'username': EMAIL, 'password': PASSWORD,} 
r = client.post(URL, data=login_data, headers={"Referer": "foo"}) 
print r 
를 사용하고있어 코드입니다 것 같아 수있어 반환 내가 r.text을 인쇄하는 경우

와 나는 그들은 장고와 피라미드의 조합을 사용하고

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html lang="en"> 
<head><script type="text/javascript">var NREUMQ=NREUMQ||[];NREUMQ.push(["mark","firstbyte",new Date().getTime()])</script> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
    <meta name="robots" content="NONE,NOARCHIVE"> 
    <title>403 Forbidden</title> 
    <style type="text/css"> 
    html * { padding:0; margin:0; } 
    body * { padding:10px 20px; } 
    body * * { padding:0; } 
    body { font:small sans-serif; background:#eee; } 
    body>div { border-bottom:1px solid #ddd; } 
    h1 { font-weight:normal; margin-bottom:.4em; } 
    h1 span { font-size:60%; color:#666; font-weight:normal; } 
    #info { background:#f6f6f6; } 
    #info ul { margin: 0.5em 4em; } 
    #info p, #summary p { padding-top:10px; } 
    #summary { background: #ffc; } 
    #explanation { background:#eee; border-bottom: 0px none; } 
    </style> 
</head> 
<body> 
<div id="summary"> 
    <h1>Forbidden <span>(403)</span></h1> 
    <p>CSRF verification failed. Request aborted.</p> 

</div> 

<div id="explanation"> 
    <p><small>More information is available with DEBUG=True.</small></p> 
</div> 

<script type="text/javascript">if(!NREUMQ.f){NREUMQ.f=function(){NREUMQ.push(["load",new Date().getTime()]);var e=document.createElement("script");e.type="text/javascript";e.src=(("http:"===document.location.protocol)?"http:":"https:")+"//"+"d1ros97qkrwjf5.cloudfront.net/42/eum/rum.js";document.body.appendChild(e);if(NREUMQ.a)NREUMQ.a();};NREUMQ.a=window.onload;window.onload=NREUMQ.f;};NREUMQ.push(["nrfj","beacon-1.newrelic.com","0e859e0620",778660,"ZAZRbUcHWBAHURFYX11MdUxbBUIKCVxKVVpSDVRWGwtfBwJeAEZRQQYdWkYUUFklQRdXZloGRHRcAlIPA0UEQ1UdE0FWVgNFEDlEDFRH",0,7,new Date().getTime(),"","","","",""])</script></body> 
</html> 

를 얻을.

저는 약 2 일 동안 이걸 가지고 놀았지만 분명히 아무데도 못 받았습니다. 당신의 도움을 주셔서 감사합니다. 오류 메시지에서 알 수 있듯이, 당신이 먼저 GET에 로그인 페이지를 필요로하는 csrf token

누락

답변

12

로그인의 나머지와 함께 페이지는 CSRF 토큰을 사용하여 사이트 간 스크립팅 공격을 방지합니다. 먼저 토큰을 검색해야합니다. 답장을 보내

client = requests.session() 

# Retrieve the CSRF token first 
client.get(URL) # sets the cookie 
csrftoken = client.cookies['csrftoken'] 

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken) 
r = client.post(URL, data=login_data, headers={"Referer": "foo"}) 
+0

답장을 보내 주셔서 감사합니다.하지만 여전히 동일한 오류가 발생합니다. 논리는 이해가된다. 아마도 csrf_token은'POST'에서 다른 매개 변수로 전달되어야할까요? 요청 및 csrf_tokens에 대한 정보를 찾을 수 없습니다. – Jeff

+0

@Jeff : 매개 변수가 정확합니다. 브라우저는 정확히 동일한 이름으로 게시합니다. 서버가 사용자 에이전트 문자열 테스트와 같은 다른 조치를 취할 수 있습니다. 시행 착오가 필요합니다. 로그인 할 때 게시 된 내용에 대한 브라우저의 개발자 도구가 무엇인지 언제나 알 수 있습니다. –

+0

대부분의 경우 CSRF 토큰이 requests.Session() 객체 내부에서 요청되어야합니다. 그렇지 않으면 CSRF 토큰이 유효하지 않습니다. –

4

, 토큰 CSRF 및 POST를 읽어 다시 폼 데이터

+0

감사 :

로그인 페이지가 동일한 토큰 쿠키를 설정, 우리는 우리가 로그인 작성하려면이 통과하기 전에 먼저 토큰 로그인 페이지와 잡아로드해야합니다. 귀하의 접근 방식이 Martijn의 접근 방식과 같다고 들립니다. 그러나 나는이 일을하려고하는 동일한 오류가 발생했습니다. 지금까지의 추측에 따르면 올바른 매개 변수로 csrf_token을 전달하지 않습니다. 어디로 전달 해야할지 알고 싶습니까? – Jeff