Python字典的Fuzzer

2024-04-29 08:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在寻找Python字典的fuzzer。我已经知道一些模糊工具,例如:

然而,它们似乎比我要找的东西要宽泛一点。实际上,我的目标是为给定的工具提供一个Python字典,并获得一个与输入字典非常相似的新字典,但是有些值发生了更改。在

例如,提供

{k1: "aaa", k2: "bbb", k3: "ccc"}

我打算获得以下新词典:

^{pr2}$

你知道这种工具吗?欢迎提出任何建议。在

在最好的情况下,我希望这是一个开源工具。在

编辑1: 我发布了我目前尝试过的代码:

  def change_randomly(self, v):
    from random import randint
    import string

    new_v = list(v)
    pos_value = randint(0, len(v)-1)
    random_char = string.letters[randint(0, len(string.letters)-1)]

    new_v[pos_value] = str(random_char)
    return ''.join(new_v)

当然,它可能会改进,所以我期待着任何关于它的想法。在

谢谢!在


Tags: 工具posimportnewstringlen字典value
1条回答
网友
1楼 · 发布于 2024-04-29 08:08:40

基于对问题的评论,为什么不简单地编写一个基于固定长度模板的fuzzer,如下所示:

#! /usr/bin/env python
"""Minimal template based dict string value fuzzer."""
from __future__ import print_function

import random
import string


def random_string(rng, length, chars=string.printable):
    """A random string with given length."""
    return ''.join(rng.choice(chars) for _ in range(length))


def dict_string_template_fuzz_gen(rng, dict_in):
    """Given a random number generator rng, and starting from
    template dict_in expected to have only strings as values,
    this generator function yields derived dicts with random
    variations in the string values keeping the length of
    those identical."""

    while True:
        yield dict((k, random_string(rng, len(v))) for k, v in dict_in.items())


def main():
    """Drive a test run of minimal template fuzz."""

    k1, k2, k3 = 'ka', 'kb', 'kc'
    template = {k1: "aaa", k2: "bbb", k3: "ccc"}

    print("# Input(template):")
    print(template)

    rng = random.SystemRandom()
    print("# Output(fuzz):")
    for n, fuzz in enumerate(dict_string_template_fuzz_gen(rng,
                             template), start=0):
        print(fuzz)
        if n > 3:
            break

if __name__ == '__main__':
    main()

在用例输入上,它可能会产生以下结果:

^{pr2}$

因此,这应该让OP开始一些事情,因为这可能是一个引导问题,Python知识才刚刚开始。。。在

我只是在PEP8兼容的环境下破解了它,不管是pythonv2还是v3,它都能正常工作。在

还有很多工作要做。。。但是如果一个库或者一些简单的增强编码就足够了,那么应该让一个去评估。只有运营商会知道,但欢迎评论这个答案建议或更新问题。在

提示:我几乎总是使用SystemRandom,这样您就可以更可靠地并行化了。可能有更快的方法,但是在规范中我看不到性能。印刷品当然是散乱的,因为这充其量是教育性的。高温

更新: 在阅读了关于只更改部分字符串以保持某些相似性的OP注释后,可以通过以下方式交换上面的fuzzer函数:

def dict_string_template_fuzz_len_gen(rng, dict_in, f_len=1):
    """Given a random number generator rng, and starting from
    template dict_in expected to have only strings as values,
    this generator function yields derived dicts with random
    variations in the string values keeping the length of
    those identical.
    Added as hack the f_len parameter that counts the
    characters open to be fuzzed from the end of the string."""

    r_s = random_string  # shorten for line readability below
    while True:
        yield dict(
            (k, v[:f_len + 1] + r_s(rng, f_len)) for k, v in dict_in.items())

然后作为样本输出:

# Input(template):
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'}
# Output(fuzz):
{'kc': 'cc\t', 'kb': 'bbd', 'ka': 'aa\\'}
{'kc': 'cc&', 'kb': 'bbt', 'ka': 'aa\\'}
{'kc': 'ccg', 'kb': 'bb_', 'ka': 'aaJ'}
{'kc': 'ccc', 'kb': 'bbv', 'ka': 'aau'}
{'kc': 'ccw', 'kb': 'bbs', 'ka': "aa'"}

调用此函数而不是另一个函数时。在

相关问题 更多 >