Войдите в веб-приложение asp.net с помощью python - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь войти в одно веб-приложение с python, но сама попытка заканчивается ошибкой 500, и в html теле отображается ошибка: [HttpAntiForgeryException]. Я попытался применить несколько решений из других вопросов здесь, но ничего не помогло. Итак, теперь я при первом запросе получаю ответ, который дает мне 500.

import requests
from bs4 import BeautifulSoup 

url = "http://localhost:52053/Account/Login"

username = "test@test.sk"
user_password = "pass"

session = requests.Session()
response = session.get(url)
soup = BeautifulSoup(response.content, features="html.parser")
#print(soup)
states = ["__RequestVerificationToken", "Email", "RememberMe"]
login_data = {"username": username, "password": user_password, "Login": "submit"}
headers = {"Host": "localhost:52053",
           "Content-Type": "application/x-www-form-urlencoded",
           "Connection": "close",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0)",
           "Cookie": str(session.cookies.get_dict())}

for state in states:  # search for existing aspnet states and get its values
    result = soup.find('input', {'name': state})
    if not (result is None):  # when existent (some may not be needed!)
        if state == "Email":
            login_data.update({state: login_data["username"]})
        else:
            login_data.update({state: result['value']})


post_request = session.post(url, headers=headers, data=login_data)

Успешная попытка входа в систему выглядит следующим образом.

POST /Account/Login HTTP/1.1
Host: localhost:52053
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: sk,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 193
Origin: http://localhost:52053
Connection: close
Referer: http://localhost:52053/Account/Login
Cookie: __RequestVerificationToken=j9yFGpTFSlH5_aQt0k-Gvz10I16TVXbDk31NKPm1HkcWsksUfKXkjL567yFplCS_VovTR7lVuEgNjwgp-EO3RjNj4gQOvNUXnPkjymZx_jA1
Upgrade-Insecure-Requests: 1

__RequestVerificationToken=LjHuOdKSCr1A7KRDNie4GUnCZ3qRwUCdHyLlPYT40DsEB-GNUvEKxe5nvZWf5gZ4ZflwI43xGWPyYu8GI15wroEg9WRRVtSzZ9-KY9Mu_JA1&Email=test%40test.sk&Password=pass&RememberMe=false

Следующий ответ:

HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Location: /
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
Set-Cookie: .AspNet.ExternalCookie=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: .AspNet.ApplicationCookie=KCLm03FHj8v_6rIpTzBTm7EzEtzpKmIz1Z9_z29wycUSqUVyKbGEmptXUwG41MqNOMR7Vbeq2u576ijazupNLffLP-Ua0n60aLmnVSDsLsdTqYT7jjqyGPw1Ppp8AnIDs3sdefmksazX2UvKTxzxRBufFCoxtCJx51mWtBv7v0JzUeC1hnfu1AIJ7GH_8T59KD3iv0hRSHDqlWHlkWzyN1Xt0m5ixC14e4eC2YxEm3_acy96atB2Jv5u0HREPzssLmywuzj6sLa9cHCllTG2gMVWvHA3IDhCWu7Ojf8BO02Eml3pPM5QTJ-sq540fcj9QyELayUOwBZWffSgsJeq8mlt3FupQcJ-JTJxDzAsDc4Cmk-BcvYSfpAJq4SdR-Y4mTN_6vu-wwAOLZPSgh-5K7guWmZ3VfRitZHXd_rvTEmMiVrgHFTEQAkUYu4zTSupxRplTtKb1VSDs0Nc1uEos2z0_aw-nBbRBrTPpvmqGok

Поток аутентификации продолжается с этим запросом. Я пока не пытаюсь отправить этот запрос (я поставил его здесь просто для лучшего воображения):

GET / HTTP/1.1
Host: localhost:52053
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: sk,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:52053/Account/Login
Connection: close
Cookie: __RequestVerificationToken=j9yFGpTFSlH5_aQt0k-Gvz10I16TVXbDk31NKPm1HkcWsksUfKXkjL567yFplCS_VovTR7lVuEgNjwgp-EO3RjNj4gQOvNUXnPkjymZx_jA1;
.AspNet.ApplicationCookie=gvv113IJhtdaOhdc0Rz2N--5Ob18W6gS64J3wtOJggRTqE70h-8HyBGQAmLvSM2qCV2e-dXR2Uto-BktD6NmNz6dJtxckIYasPOfqodDNZX33YJxNEDg7a64LPi1bNnmrnvQcOHAceQNqZDykXrhFm55dqoo1oZnJHfZQnltwqAdg7DGO31PZpzu-GAZh2_gzuxd_saJdS09ZZQrc9h7WiU2ONqeya87pSAN7ZyHQ_XvsU5cUwDGq7FWLpzlIeeZWkay6iWVmCSwNEofpdVsb880P3XZnFKEj2SW2PfazdNLfgy86YNjkoD6_3Vb1BLirRoSP0XIQMcs2F_CzgXkxD5GvDray8TPYqcQJ4L2fikReUJHadx9fFnslF2BFcnKYC8D-Xusrda_5r-CQoQ4SzAe2Cqn0h1NYHxS1wsxt35neC5RuQ3geadAEEghjrSSVhSl8jCfACtQtcBeNL2x_m6I9L3XJCjMpzJjtP6up3E
Upgrade-Insecure-Requests: 1

Следующий ответ всего лишь 200 - вы находитесь.

Так что мойПроблема в том, что ответ на первый запрос не удался. Кто-то может увидеть какую-то ошибку или я что-то забыл?

Неудачный ответ от первого запроса:

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcUENBZG1pbmlzdHJhdG9yXERlc2t0b3BccGVuIHRlc3RpbmdcU2VjdXJpdHlXb3Jrc2hvcC1EVldBLW1hc3RlclxkdndhLXRyYWluaW5nXGR2d2EtdHJhaW5pbmdcQWNjb3VudFxMb2dpbg==?=

Если я попытаюсь распечатать заголовки запроса и login_data, результат будет:

print (post_request.request.headers)

{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0)', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'close', 'Host': 'localhost:52053', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': "{'__RequestVerificationToken': 'yg-7mFRyZiONwsZ2dIVkIIW5tB7gSL_sazgphg-VuW2OpNNRRkxmLH-9SZJXiN9whUC_BYTo8RgsiDrVjcYtLEf9anW56rVwZ2RQPzxHA481'}", 'Content-Length': '249'}

print (login_data)

{'username': 'test@test.sk', 'password': 'pass', 'Login': 'submit', '__RequestVerificationToken': '14OuwaRqldlGKi93C91zf6QD_ouOorHBDe63s4KgfP3gbt85V0QMy2X5OMwWAo1TUrD8zJ-zoZbXLPpgDI_wrxVZv3ceYNos_e5_elFhVt01', 'Email': 'test@test.sk', 'RememberMe': 'true', 'Password': 'pass'}

1 Ответ

0 голосов
/ 02 ноября 2019

Я просто нашел решение.

Запросы могли обрабатывать все заголовки отдельно (а мои заголовки по какой-то причине вызывали ошибки), он перенаправлял мой запрос на ответ 200, поэтому я не сталмгновенно увидел, что он на самом деле работает и ловит ответ 302.

Я узнал, напечатав:

print(post_request.history)

Что дало мне <[302]>

Теперь,когда я знаю, что есть перенаправление, мне просто нужно allow_redirects=False, и теперь я могу перехватить мой заголовок set-cookie

полный код, ведьма получает ожидаемые ответыэто:

import requests
from bs4 import BeautifulSoup

url = "http://localhost:52053/Account/Login"
username = "test@test.sk"
user_password = "pass"

session = requests.Session()
response = session.get(url)
soup = BeautifulSoup(response.content, features="html.parser")
#print(soup)
states = ["__RequestVerificationToken", "Email", "RememberMe"]
login_data = {"username": username, "password": user_password, "Login": "submit"}

for state in states:  # search for existing aspnet states and get its values
    result = soup.find('input', {'name': state})
    if not (result is None):  # when existent (some may not be needed!)
        if state == "Email":
            login_data.update({state: login_data["username"]})
        else:
            login_data.update({state: result['value']})


post_request = session.post(url,  data=login_data, allow_redirects=False)

print(login_data)

#the code below is testing, if the HttpAntiForgeryException is in code

if "HttpAntiForgeryException" not in post_request.text:
    print(post_request.headers)
else:
    print("antiforgery")
...