어떻게 Python 의 Requests 패 키 지 를 사용 하여 아 날로 그 로그 인 을 실현 합 니까?
오늘 시험 해 봤 는데 개인 홈 페이지 에 모 의 접속 을 했 어 요.발견 도 간단 하 다.본 고 를 읽 으 려 면 http 프로 토 콜 과 http 세 션 에 대해 어느 정도 이해 해 야 합 니 다.
설명:아 날로 그 로그 인 은 제 개인 사이트 이기 때문에 다음 코드 는 개인 사이트 와 계 정 비밀 번 호 를 처리 합 니 다.
사이트 분석
파충류 의 필수 첫걸음,목표 사이트 분석.이곳 은 구 글 브 라 우 저의 개발 자 도구 분석 을 사용한다.
로그 인 캡 처 를 통 해 이러한 요청 을 볼 수 있 습 니 다.
상단 부분 은 요청 헤드 이 고,아래 부분 은 요청 이 전 달 된 매개 변수 입 니 다.그림 을 통 해 알 수 있 듯 이 페이지 는 폼 을 통 해 세 개의 인 자 를 제출 했다.각각csrf,usermane,password。
그 중에서 csrf 는 크로스 스 크 립 트 위 조 를 예방 하기 위해 서 입 니 다.원 리 는 간단 하 다.모든 요청 에 서버 가 암호 화 문자열 을 만 드 는 것 이다.숨겨 진 input 폼 에 넣 습 니 다.다시 한 번 요청 할 때 이 문자열 을 함께 보 냅 니 다.같은 사용자 의 요청 인지 확인 하기 위해 서 입 니 다.
그래서 우리 의 코드 논리 가 생 겼 다.우선 로그 인 페이지 를 요청 합 니 다.그리고 페이지 를 분석 하여 csrf 문자열 을 가 져 옵 니 다.마지막 으로 이 문자열 을 계 정 비밀번호 와 함께 서버 에 전송 하여 로그 인 합 니 다.
첫 번 째 코드
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import requests
import re
#
headers = {
'Host':"localhost",
'Accept-Language':"zh-CN,zh;q=0.8",
'Accept-Encoding':"gzip, deflate",
'Content-Type':"application/x-www-form-urlencoded",
'Connection':"keep-alive",
'Referer':"http://localhost/login",
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}
#
def login(url,csrf):
data = {
"_csrf" : csrf,
"username": "xiedj",
"password": "***"
}
response = requests.post(url, data=data, headers=headers)
return response.content
# csrf
def get_login_web(url):
page = requests.get('http://localhost/login')
reg = r'<meta name="csrf-token" content="(.+)">'
csrf = re.findall(reg,page.content)[0]
login_page = login(url,csrf)
print login_page
if __name__ == "__main__":
url = "http://localhost/login/checklogin"
get_login_web(url)
코드 에 문제 가 없 는 것 같 습 니 다.실행 중 에 오류 가 발생 했 습 니 다.확인 해 보 니 잘못된 이 유 는 csrf 인증 이 실 패 했 기 때 문 입 니 다!가 져 온 csrf 와 로그 인 을 요청 한 csrf 문자열 이 문제 가 없 음 을 여러 번 확인 한 후에 문제 가 생각 났 습 니 다.
잘못된 이 유 를 아직 모 르 신다 면 여기 서 한 가지 생각 을 잠시 멈 출 수 있 습 니 다.""서버 는 첫 번 째 csrf 요청 과 두 번 째 post 로그 인 요청 이 같은 사용자 라 는 것 을 어떻게 알 았 습 니까?"
로그 인 에 성공 하려 면 두 번 의 요청 이 같은 사용자 라 고 믿 게 하 는 방법 을 해결 해 야 한 다 는 것 을 잘 알 고 있 을 것 입 니 다.http 세 션 을 사용 해 야 합 니 다.
http 프로 토 콜 은 무상 태 프로 토 콜 입 니 다.이런 무 상 태 를 상태 있 게 만 들 기 위해 세 션 을 도입 했다.쉽게 말 하면 세 션 을 통 해 이 상 태 를 기록 합 니 다.사용자 가 웹 서 비 스 를 처음 요청 할 때 서버 는 이 사용자 의 정 보 를 저장 하기 위해 session 을 생 성 합 니 다.또한 사용자 측 에 되 돌아 갈 때 이 session ID 를 cookies 에 저장 합 니 다.사용자 가 다시 요청 할 때 브 라 우 저 는 이 cookies 를 가 져 옵 니 다.따라서 서버 에서 같은 사용자 인지 여러 번 요청 할 수 있 습 니 다.
따라서 저희 코드 는 첫 번 째 요청 때 이 session ID 를 받 아야 합 니 다.두 번 째 요청 때 이 session ID 를 같이 보 내 주세요.그리고 requests 가 대단한 점 은 간단 한 requests.Session()한 마디 로 이 세 션 대상 을 사용 할 수 있다 는 것 이다.
두 번 째 코드
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import requests
import re
#
headers = {
'Host':"localhost",
'Accept-Language':"zh-CN,zh;q=0.8",
'Accept-Encoding':"gzip, deflate",
'Content-Type':"application/x-www-form-urlencoded",
'Connection':"keep-alive",
'Referer':"http://localhost/login",
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}
#
def login(url,csrf,r_session):
data = {
"_csrf" : csrf,
"username": "xiedj",
"password": "***"
}
response = r_session.post(url, data=data, headers=headers)
return response.content
# csrf
def get_login_web(url):
r_session = requests.Session()
page = r_session.get('http://localhost/login')
reg = r'<meta name="csrf-token" content="(.+)">'
csrf = re.findall(reg,page.content)[0]
login_page = login(url,csrf,r_session)
print login_page
if __name__ == "__main__":
url = "http://localhost/login/checklogin"
get_login_web(url)
로그 인 한 페이지 를 성공 적 으로 가 져 왔 습 니 다.코드 를 통 해 알 수 있 듯 이 requests.Session()이 세 션 대상 을 시작 하면 두 번 째 요청 은 자동 으로 지난번 session ID 를 함께 전달 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.