偶发AttributeError:模块'PacketStrings'无'attacker_ip'属性问题求助
错误触发原因
- 你在
PacketStrings.py中定义的attacker_ip、tcp_payload是packetString函数内部声明的全局变量,只有当packetString函数被调用,且执行到对应赋值分支时,这两个变量才会在模块层面被创建:- 若调用
SQLintrusion前从未调用过packetString,模块层面不存在这两个属性,直接访问就会抛出AttributeError - 就算调用过
packetString,如果传入的报文没有IP层、或者没有TCP层,对应变量不会被赋值创建,访问时也会报错
- 若调用
- 偶发的原因就是你运行时的报文场景不固定:当报文满足赋值条件、且先调用过
packetString就不会报错,反之就会触发错误。同时当前全局变量的设计还存在多报文处理时变量互相覆盖的隐患,容易出现日志记录的IP和payload不匹配的问题。
解决方案
- 方案1(推荐):废弃全局变量传参逻辑,改为函数返回值传递数据
修改PacketStrings.py中的packetString函数,在函数内部初始化默认值,最后直接返回需要的所有数据:
import re from scapy.all import * def packetString(pkt): # 函数内部初始化默认值,避免未定义 attacker_ip = None tcp_payload = "" out = "" if (IP in pkt): attacker_ip = pkt[IP].src out += ipString(pkt[IP]) elif (IPv6 in pkt): # TODO pass if (TCP in pkt): tcp_payload = payloadString(pkt[TCP]) out += tcpString(pkt[TCP]) out += "[TCP Payload]" + "\n" out+= payloadString(pkt[TCP]) elif (UDP in pkt): out += udpString(pkt[UDP]) out += "[UDP Payload]" + "\n" out += payloadString(pkt[UDP]) # 直接返回所有需要的数值 return out, attacker_ip, tcp_payload
后续调用packetString时直接接收返回值使用即可,不需要再访问模块的全局属性,从根源上避免属性不存在、变量覆盖的问题。
- 方案2:模块顶层初始化全局变量默认值
如果暂时不想改整体逻辑,可以在PacketStrings.py的最开头先给两个全局变量初始化默认值,保证模块层面始终存在这两个属性:
import re from scapy.all import * # 顶层初始化默认值 attacker_ip = None tcp_payload = "" def packetString(pkt): global attacker_ip global tcp_payload # 原有逻辑不变
后续在SQLintrusion中访问时先判断值是否为空再进行后续处理即可。
内容的提问来源于stack exchange,提问作者kod
相关产品推荐
相关产品推荐

