我正在尝试使用 python 请求模块登录网页。我在使用 chrome 提交登录表单并重新检查该表单的代码时捕获了发布请求。 (下面的代码片段中提到了网站以及参数)
根据某人的帖子,我能够创建一个尝试登录和访问受保护内容的 python 代码片段,但由于某种原因,这无法按预期工作。
这是我的 python 片段:
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
即使我发送带有所需负载的发布请求,我也无法访问受保护的内容。
响应 HTML 代码包含登录表单以及一条注释,表明我不允许在未登录的情况下访问该内容。
我在这里想念什么?
Edit:
感谢您提供非常有帮助的答案!犯了相当愚蠢的错误。我忘记了 URL 的 ?login 部分。
以下是有关该主题的后续问题的工作代码片段(经过测试,按预期工作):
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
关于 Web 身份验证
大多数网站都使用身份验证机制,以便只有提供有效凭据的用户才能访问他们想要的内容。为了更简单地想象您想要进入博物馆。你可以进入售票亭,不会有人向你索要任何东西,但你需要有票才能看到里面。考虑到这一点,您可以将网站/服务器视为售票亭,将凭证视为购买门票的资金,并且应该使用门票本身来进入博物馆的不同部分。为了让这个例子回到 Web 服务,我将尝试解释两种用于身份验证的技术
Cookie 认证
Cookies https://en.wikipedia.org/wiki/HTTP_cookie是网站发送的小块(通常是加密的)数据,并在您浏览时存储到您的计算机上。 cookie认证流程如下:
- 用户将其凭据发送到网络服务器(例如用户名/密码)
- Web 服务器验证这些凭据,然后创建并存储具有特定标识符 (sessionID) 的会话
- Web 服务器使用该 sessionID 在用户的浏览器上放置一个 cookie
- 用户对网站受保护部分发出的任何后续请求,服务器都会检查 cookie 中的 sessionID,如果有效,则返回私人信息
- 一旦用户注销,会话将被销毁,任何使用此会话ID的请求都将无效
虽然这项技术很棒,但也有一些不足安全问题 https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
令牌认证
该技术类似于 cookies,但它更好地模拟了我们的博物馆门票示例。令牌是包含私人信息的加密数据。值得注意的是,代币通常有一个到期日。认证流程如下:
- 用户将其凭据发送到网络服务器(例如用户名/密码)
- Web 服务器验证这些凭据,然后创建包含有关用户信息的令牌。在我的应用程序中,我通常包含存储在数据库中的用户 ID。请注意,服务器不必存储令牌。
- Web 服务器将令牌返回给用户
- 用户发出的任何后续请求都应包含令牌
- 一旦用户注销,令牌就应该从浏览器中销毁。需要注意的是,当用户注销并且退出时,服务器不必执行任何操作令牌在到期日期之前一直有效.
使用Postman或Curl等HTTP请求工具,可以看到该网站使用了cookie技术,登录URL为登录.
TL;DR
您的代码应该可以正常工作,唯一的问题是您用于登录的 URL。
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)