【问题标题】:POST Requests with headers and data results in 200 ok response but no user added带有标头和数据的 POST 请求导致 200 ok 响应,但未添加用户
【发布时间】:2019-05-12 06:24:48
【问题描述】:

在创建此查询之前,检查了本主题中的几个 existing posts 并按照那里的步骤进行操作,但仍然无法通过,因此在此再次提出此问题以寻求解决方案。

以下是可以从 chrome 中的检查元素网络活动中获取的握手代码。

Request URL: https://example.com/ne_rm/add/  
Request Method: POST
Status Code: 200 
Remote Address: 11.130.11.19:413
Referrer Policy: no-referrer-when-downgrade

accept-ranges: bytes
age: 0
cache-control: max-age=0
content-encoding: gzip
content-length: 22
content-type: text/html; charset=utf-8
date: Wed, 05 Dec 2018 09:27:21 GMT
expires: Wed, 05 Dec 2018 09:27:21 GMT
last-modified: Wed, 05 Dec 2018 09:27:21 GMT
server: tv
status: 200
vary: Accept-Encoding, Cookie
via: 1.1 varnish, 1.1 c34ac5faa133414ef7dde72a4f32c43d.cloudfront.net (CloudFront)
x-amz-cf-id: K3-mr0hE2iObHSoWssicdKTZzCGsWEUnSUSws1v-fln9jP1gT668sQ==
x-cache: Miss from cloudfront
x-frame-options: SAMEORIGIN
x-varnish: 3925923656

:authority: example.com
:method: POST
:path: /ne_rm/add/
:scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
content-length: 72
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: km_lv=x; _ga=GA1.2.927532329.1495375443; km_ai=xxx@mail.com;  km_ni=xx@gmail.com; sessionid=0j95mvy7sssxss41i6woawmj3nyqw11a; csrftoken=SDmN222meuuKexz3333nPXue2yw22TGV7dfff; _sp_id.df1c=15d71e85-964f-42ee-965a->4a9d8c0902ec.1538974408.1.1538974410.1538974408.37c368eb-6de7-4716-8e84->06b17f6e6914; __utmz=226258911.1539246301.382.19.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); tv_ecuid=189b7a17-8451-4ae3-9443-3cec2dda407d; __utmc=226258911; _sp_ses.cf1a=*; __utma=226258911.927532329.1495375443.1543915752.1544001282.532; km_vs=1; _sp_id.cf1a=f53754cc-c8ba-42e2-a310-08566d71540d.1539169168.144.1544001661.1543915787.f1ddde18-9adf-4e88-a852-1485403f2587; kvcd=1544001661767; __utmb=226258911.10.9.1544001932454
origin: https://example.com
referer: https://example.com/script/Zo-Tester/
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
x-csrftoken: SDmN222meuuKexz3333nPXue2yw22TGV7dfff
x-language: in
x-requested-with: XMLHttpRequest

id: PUB;FMx5WvjpGrmETV username_recip: xxxxyyzzz

这里使用 id 和用户名作为数据,我想调用 https://example.com/ne_rm/add/ 并将这个用户名添加到列表中。使用 POST Chrome 扩展程序执行此操作时,我得到 200 Ok 作为响应,并且名称已添加到列表中。同时在使用python代码执行此操作时,我确实得到了 200 Ok 作为响应代码,但操作不成功。

注意 POST 浏览器的最低限度是什么,在 python 中单独使用但它失败了。

你能帮我完成这项工作吗?

这里是代码

import requests
import json

# *optional*, the site may not care about these. If they *do* care, then
# they care about keeping out automated scripts and could in future 
# raise the stakes and require more 'browser-like' markers. Ask yourself
# if you want to anger the site owners and get into an arms race.
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    'origin':'https://www.example.com',
    'referer':'https://example.com/script/Zo-Tester/',
    'x-csrftoken': 'SDmN222meuuKexz333nPXue2yw22TGV7dfff',
}

payload = {
    'x-csrftoken': 'SDmN222meuuKexz333nPXue2yw22TGV7dfff',
    'username_recip':'xxxxyyzzz',
    'pine_id':'PUB;FMx5WvjpGrmETV',
}

url = 'https://www.example.com/ne_rm/add/'
# the URL from the Referer header, but others at the site would probably
# also work
#Referrer URL
initial_url = 'https://example.com/script/Zo-Tester/'

with requests.Session() as session:
    # obtain CSRF cookie
    #initial_response  = session.get(initial_url)
    #payload['csrf_test_name'] = session.cookies['csrf_cookie_name']

    # Now actually post with the correct CSRF cookie
    response = session.post(url, headers=headers, data=payload)
    print(response)
    input("wait")

【问题讨论】:

  • 你不能只重用一个 CSRF 令牌。您必须首先整理出令牌。
  • 您发布的请求/响应对可以看到 CSRF 令牌存储在 cookie 中(浏览器发送的 Cookie 标头有 csrftoken=SDmN222meuuKexz3333nPXue2yw22TGV7dfff;,该 cookie 首先是给浏览器的在较早的请求中。您注释掉的我的答案中的代码从初始请求中获取该令牌,并且通过禁用它,您确保服务器现在不会信任您的请求,因为它不会包含一个有效的 CSRF 令牌。
  • 如何实现此任何代码示例,请。我是 python 和这种头文件处理的新手。

标签: python post python-requests postman


【解决方案1】:

您需要取消注释# obtain CSRF cookie 的一部分以获得新的x-csrftoken,如果我在您的Chrome 标头中看到,它的id 不是pine_id?

import requests
import json


headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    'origin':'https://www.example.com',
    'referer':'https://example.com/script/Zo-Tester/',
}

payload = {
    'username_recip':'xxxxyyzzz',
    'pine_id':'PUB;FMx5WvjpGrmETV' # it should be 'id' ?
}

url = 'https://www.example.com/ne_rm/add/'
initial_url = 'https://example.com/script/Zo-Tester/'

with requests.Session() as session:
    # obtain CSRF cookie
    initial_response  = session.get(initial_url)
    headers['x-csrftoken'] = session.cookies['csrftoken']

    # Now actually post with the correct CSRF cookie
    response = session.post(url, headers=headers, data=payload)
    print(response)
    input("wait")

【讨论】:

  • 这是 pine_id 而不是标题 ID 这是正确的。我更改了取消注释部分的代码,这是错误。不成功 payload['x-csrftoken'] = session.cookies['x-csrftoken'] return self._find_no_duplicates(name) _find_no_duplicates raise KeyError('name=%r, domain=%r, path=%r' % (名称、域、路径)) KeyError: "name='x-csrftoken', domain=None, path=None"
  • 与我的问题报告的代码相比,代码中是否有任何变化。已经传达了评论此行不起作用的信息。
  • 您是否删除了标头和有效负载中的x-csrftoken?您的代码似乎是正确的。如果您不介意发布网址。
  • 在邮递员查询中也必须包含 x-csrftoken ,否则它在 chrom POSTMAN 模拟中不起作用,现在尝试删除和测试仍然失败。不幸的是,不允许分享网址。
  • 我刚刚找到它,x-csrftoken 以csrftoken 的形式存储在 cookie 中,需要作为标头发送,请参阅编辑后的答案。
猜你喜欢
  • 2017-01-17
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多