我正在尝试创建一个脚本,它将更改字符串中单个字符的编码:
import random
import chardet
def tamper(payload):
data_range = range(0, len(payload))
accepted_encodings = ["iso-8859-1", "iso-8859-15", "utf-8", "ascii",
"iso-8859-2"]
tampered_payload = []
for i, char in enumerate(list(payload)):
if i == random.choice(data_range):
tampered_payload.append(char.replace(char, char.encode(random.choice(accepted_encodings))))
else:
tampered_payload.append(char)
return ''.join(tampered_payload)
当我通过chardet.detect(c)
运行时,会输出以下内容:
if __name__ == '__main__':
for c in tamper("SELECT * FROM *"):
print chardet.detect(c)
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
现在我知道这个脚本不能保证由于随机函数而改变字符串中的编码,但是为什么不管我做什么,即使字符已经使用其中一个被重新编码编码,它始终输出为ascii
,python是否总是将字符转换为字符串中的ascii?
我也尝试使用codecs
进行编码:
import random
import chardet
import codecs
def tamper(payload):
accepted_encodings = ["iso-8859-1", "iso-8859-15", "utf-8",
"iso-8859-2"]
test = "string"
to_encode = random.choice(accepted_encodings)
print to_encode
codecs.encode(test, to_encode)
print chardet.detect(test)
if __name__ == '__main__':
tamper("SELECT * FROM *")
# <= {'confidence': 1.0, 'encoding': 'ascii'}
它似乎做了同样的事情,这让我相信,A)我是一个白痴,我缺少一些东西(很可能是个案)或B)这是chardet
本身的问题。