🐕

HTTPリクエストの送り方1(curl・form送信・python)

2023/03/01に公開

概要

HTTPリクエスト送る方法のメモ。
JavaScriptによる送り方(Ajaxリクエスト)は以下の記事に書いた。
https://zenn.dev/n_nishino/articles/7c5b56cb7315e3

記載した方法一覧

  • curlコマンド利用
  • HTML(formタグ)利用
  • Python(requestsライブラリ)利用
  • Python(requestsライブラリ)利用 【セッション管理したいver】

1.curlコマンドによるHTTPリクエスト

基本はcurl <リクエスト先URL>

  • メソッドを指定したい場合は-Xオプションを用いる。
  • ヘッダー付与したい場合は-Hオプションを用いる。例)-H "MY_Header: hogehoge"
    ※Cookieの場合は-Hのほか、-bオプションでもよい。例)-b "cookie1=hoge; cookie2=moge"
  • ボディ(パラメータ)を付与したい場合は-dオプションを用いる。例)-d "test=hoge"
  • リクエスト・レスポンスの詳細を確認したい場合は-vオプションを付ける。

URL:★★にCookieとヘッダーとボディを付与しPOSTリクエストするcurlコマンド

curl -X POST -v -H "test_header: aaa" -b "test_cookie=bbb" -d "test_body=ccc" ★★

2.HTML(formタグ)によるHTTPリクエスト

フォーム送信を用いてリクエストを送信する(よくあるボタンおしてリクエスト飛ぶやつ)

  • formタグのaction属性にリクエスト先URLを指定する。
  • formタグのmethod属性でメソッドを指定する。
  • inputタグでパラメータを指定する。
    ※ヘッダーはJS使わないと付与できない。はず

URL:★★にボディを付与しPOSTリクエストするフォーム送信
※htmlファイルをブラウザで開いて送信ボタンを押下する

<form action="★★" method="POST">
  <input name="test" value="hoge">
  <input type="submit" value="送信ボタン">
</form>

3.Python(requestsライブラリ)によるAjaxリクエスト

URL:★★にJSONボディとそれに対応するContent-Typeヘッダーを付与し、POSTリクエストするAjaxリクエスト

import requests
import json

# ヘッダーとCookieとJSONパラメータを作成
headers = {"Content-Type": "application/json"}
cookies = {"test_cookie": "aaa"}
data = json.dumps({"test": "hoge"})

# POSTリクエストを送信
response = requests.post("https://enwbf93olc1t.x.pipedream.net/", headers=headers, cookies=cookies, data=data)

# レスポンスを表示
if response.status_code == 200:
    print("[200 OK]", response.text)
else:
    print("[ERROR]", response.status_code)

4.Python(requestsライブラリ)によるAjaxリクエスト【セッション管理ver】

一連のセッションの下でリクエストの送信を行いたい場合。
例えば1番目にログインのリクエストを行いレスポンスでSet-Cookieヘッダーの内容を記録。2番目以降のリクエストではCookieをリクエストに載せたい時は、requests.Sessionというオブジェクトを利用するとよい。

import requests

session = requests.Session()

url = "★★"
login_data = json.dumps({"id":"test","password":"abc"})

# ログインのリクエスト(POSTリクエスト)を送信
login_response = session.post(url + "/login", data=login_data)

# その後のGETリクエスト。ログインのレスポンスでSet-Cookieされていれば、リクエストにCookieヘッダーが自動で付与される
data_response = session.get(url + "/data")

参考

詳解セキュリティコンテスト ~CTFで学ぶ脆弱性攻略の技術
https://amzn.to/3lEAcgY

Discussion