我正在尝试构建一个Web应用程序模糊器。它会从用户那里获取一个单词表和一个URL,并向这些URL发出请求。最后,它将根据其响应的状态码给出输出。
我已经编写了一些代码,它在本地的速度为〜600req / s(大约需要8秒才能完成4600行的单词表),但是由于我使用的是requests
库,所以我在想是否有一种更快的方法为此。
我分析的唯一耗时的部分是fuzz()和req()函数,因为它们做的最多。我还有其他功能,但是我已经展示的功能必须足以让您理解(我不想放太多代码)。
def __init__(self):
self.statusCodes = [200, 204, 301, 302, 307, 403]
self.session = requests.Session()
self.headers = {
'User-Agent': 'x',
'Connection': 'Closed'
}
def req(self, URL):
# request to only one url
try:
r = self.session.head(URL, allow_redirects=False, headers=self.headers, timeout=3)
if r.status_code in self.statusCodes:
if r.status_code == 301:
self.directories.append(URL)
self.warning("301", URL)
return
self.success(r.status_code, URL)
return
return
except requests.exceptions.ConnectTimeout:
return
except requests.exceptions.ConnectionError:
self.error("Connection error")
sys.exit(1)
def fuzz(self):
pool = ThreadPool(self.threads)
pool.map(self.req, self.URLList)
pool.close()
pool.join()
return
#self.threads is number of threads
#self.URLList is a list of full urls
'__init__' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>, 'http://localhost', '/usr/share/wordlists/seclists/Discovery/Web-Content/common.txt', 25), {}) 0.00362110137939453125 sec
#each req is around this
'req' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>, 'http://localhost/webedit'), {}) 0.00855112075805664062 sec
'fuzz' ((<MWAF.MWAF instance at 0x7f554cd8dcb0>,), {}) 7.39054012298583984375 sec
Whole Program
[*] 7.39426517487
答案 0 :(得分:1)
您可能希望将多个进程与多个线程结合在一起。正如400 threads in 20 processes outperform 400 threads in 4 processes while performing an I/O-bound task所示,每个进程有一个最佳的线程数-等待I / O的时间百分比越高。
按照消失的更高顺序,您可以尝试重用prepared requests以节省对象创建时间。 (我不确定这是否会起作用-requests
可能会将它们视为不可变的,因此无论如何每次都会创建一个新对象。但这仍然可能会缩短输入验证时间或其他时间。)