Pythonのurllib.request.Requestでheadersを指定しても反映されない?
Python3のurllib.request.Request
のheadersでhttp headerを指定してもheaderが送信されないのですがなぜこのようなことがおこるのでしょうか?
mnctf2017というctfサイトの情報照会というお題に取り組んでいるのですが、この問題では、FLAGをとるためにAPIサーバに問い合わせる必要があります。
APIにアクセスするためにはAPI tokenのようなものをX-TOKEN
ヘッダに追加しなければなりません。
X-TOKENヘッダを追加するためにurllib.request.Requestの引数のheadersに{"X-TOKEN": token}
としてリクエストを送信するのですが、X-TOKENをヘッダに追加したにもかかわらず、X-TOKENがないというエラーが返ってきます。
なぜでしょうか?
ちなみに他の方の答えを見たところrequestsをつかうとうまくいくようです。
urllibを使ってアクセスするコード:
import urllib.request as ur
import urllib.parse as up
import time
import json
hashlist = open("minhashlist.txt").read().split("\n")[:-1]
malware_name = "RAT.A.aa74e"
apikey = "578459a056231ac6745fcb53e3304b3043bb7c9448863e84652764592d15b3d1"
def get_apitoken():
post_data = up.urlencode({"key": apikey}).encode("utf-8")
res = ur.urlopen("http://157.7.53.197/intel/gettoken/", data=post_data)
res_str = res.read().decode("ascii")
res_json = json.loads(res_str)
return res_json["expire"], res_json["token"]
def search(token, hash):
print(token)
data = up.urlencode({"hash": hash}).encode("utf-8")
req = ur.Request("http://157.7.53.197/intel/query/", data=data, headers={
"x-token": token # ここで"X-TOKEN"を追加した
})
res = ur.urlopen(req)
body = res.read().decode("utf-8")
res_json = json.loads(body)
if res_json["auth"] != "success": #認証に失敗したらエラーを発生させる
raise Exception("auth error: " + res_json["reason"])
if malware_name in detection_name:
print("answer:", res_json["hash"])
def main():
expire, token = get_apitoken()
expire = int(expire)
for v in hashlist:
search(token, v)
now = time.time()
if now >= expired:
expire, token = get_apitoken()
expire = int(expire)
エラーメッセージ:
Traceback (most recent call last):
File "getinfo.py", line 41, in <module>
main()
File "getinfo.py", line 35, in main
search(token, v)
File "getinfo.py", line 27, in search
raise Exception("auth error: " + res_json["reason"])
Exception: auth error: no x-token header
http://mnctf.info/mnctf2017/top.php
[上のURLの"情報照会"という問題です]
このCTFで使用するAPIサーバの仕様書
http://mnctf.info/mnctf2017/task/MiNTEL_API_Reference.pdf
環境:
Windows 10
Python 3.6.7