我正试图为一个网络安全项目编写一个爬网程序,但我对一个使用多处理的方法有着奇怪的行为。
这种方法应该做什么它迭代已找到的目标网页,并列出已找到的查询参数对于每个网页,它应该将方法phase1(我的攻击逻辑(应用于与该页面关联的每个查询参数
意思是,如果我有http://example.com/sub.php,具有page&secret作为查询参数,以及http://example.com/s2.php,将topsecret作为参数,它应该执行以下操作:
- 攻击页面http://example.com/sub.php
- 攻击秘密http://example.com/sub.php
- 攻击顶级机密http://example.com/s2.php
根据第1阶段的时间和输出,我知道是否发生了攻击。
实际发生了什么
只执行第一次攻击。以下对apply_async的调用将被忽略。然而,它仍然在循环中循环,因为它仍然为循环打印上面的输出。
这里出了什么问题?为什么没有触发攻击程序?我查阅了多处理的文档,但这无助于解释这种现象。
相关问题中的一些答案建议使用terminate和join,但由于我使用的是with语句,这不是在这里隐含地完成的吗?
此外,这个问题(多处理器池';apply_async';似乎只调用函数一次(听起来很相似,但与我的问题不同。与这个问题相反,我不存在只有1个工作线程执行代码的问题,而是我的X个工作线程只生成一次(而不是Y次(。
我试过的:。。池在循环之外,但没有改变
有问题的方法如下:
def analyzeParam(siteparams, paysplit, victim2, verbose, depth, file, authcookie):
result = {}
subdir = parseUrl(viclist[0])
for victim, paramlist in siteparams.items():
sub = {}
print("n{0}[INFO]{1} param{4}|{2} Attacking {3}".format(color.RD, color.END + color.O, color.END, victim, color.END+color.RD))
time.sleep(1.5)
for param in paramlist:
payloads = []
nullbytes = []
print("n{0}[INFO]{1} param{4}|{2} Using {3}n".format(color.RD, color.END + color.O, color.END, param, color.END+color.RD))
time.sleep(1.5)
with Pool(processes=processes) as pool:
res = [pool.apply_async(phase1, args=(1,victim,victim2,param,None,"",verbose,depth,l,file,authcookie,"",)) for l in paysplit]
for i in res:
#fetch results
tuples = i.get()
payloads += tuples[0]
nullbytes += tuples[1]
sub[param] = (payloads, nullbytes)
time.sleep(3)
result[victim] = sub
if not os.path.exists(cachedir+subdir):
os.makedirs(cachedir+subdir)
with open(cachedir+subdir+"spider-phase2.json", "w+") as f:
json.dump(result, f, sort_keys=True, indent=4)
return result
一些技术信息:
- Python版本:3.8.5
- 我怀疑错误是否存在于阶段1,因为当在循环之外用Pool调用时,但多次调用时,它都会按预期运行。如果你想查找它,源代码在这里:https://github.com/VainlyStrain/Vailyn
如何解决此问题?谢谢
感谢jasonharper发现了这个问题!问题不在于上面的代码结构,而在于变量paysplit,它是一个生成器,在第一次调用后就耗尽了。
再次感谢您的指出!
最佳