2016-06-14 5 views
-1

В настоящее время я ищу fuzzer для словарей Python. Я уже знал о некоторых Fuzzing инструментов, таких как:Fuzzer для словарей Python

Однако, они, кажется, немного шире того, что я ищу. На самом деле, моя цель - предоставить словарь Python для данного инструмента и получить новый словарь, очень похожий на входной, но с некоторыми измененными значениями.

Например, предоставление

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

Я намерен получить следующие новые словари:

{k1: "aaj", k2: "bbb", k3: "ccc"} 
{k1: "aaa", k2: "bbr", k3: "ccc"} 
{k1: "aaa", k2: "bbb", k3: "ccp"} 
... 

Вы знаете о такого рода инструментов? Любое предложение будет приветствоваться.

В лучших сценариях я хотел бы, чтобы это был инструмент с открытым исходным кодом.

EDIT1: я выкладываю код я судимый до момента:

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) 

Конечно, это может быть улучшено, так что я с нетерпением ждет для любой мысли относительно этого.

Спасибо!

+0

Каков размер ваших словарей и что вы подразумеваете под «некоторыми значениями»? Почему бы просто не случайно изменить некоторые значения? –

+0

Обратите внимание, что запросы инструментов/библиотек явно не соответствуют теме. – jonrsharpe

+0

Запрашивать помощь для завершения части кода для выполнения этой простой задачи обычно приветствуется здесь ;-) Было бы хорошо, что вы набросаете код, а другие помогают вам, где вы застряли? И как @AbdulFatir предлагает/спрашивает: есть ли какая-то причина, почему в образце изменяется только третий chatter строк значений и только исключительно? – Dilettant

ответ

0

Основываясь на комментариях к вопросу, почему бы не просто написание 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() 

В случае варианта использования входа он может дать это:

# Input(template): 
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'} 
# Output(fuzz): 
{'kc': '6HZ', 'kb': 'zoD', 'ka': '5>b'} 
{'kc': '%<\r', 'kb': 'g>v', 'ka': 'Mo0'} 
{'kc': 'Y $', 'kb': '4z.', 'ka': '0".'} 
{'kc': '^M.', 'kb': 'QY1', 'ka': 'P0)'} 
{'kc': 'FK4', 'kb': 'oZW', 'ka': 'G1q'} 

Так это должно дать OP что-то начать, поскольку это может быть проблема начальной загрузки, где знание Python только начинается ...

Я только что взломал его - PEP8 совместим, хотя - и он должен работать независимо от того, Python v2 или v3.

Многие открытые концы для работы ... но должны получить оценку, если библиотека или простое расширенное кодирование могут быть достаточными. Только ОП будет знать, но можно прокомментировать это предложение ответа или обновить вопрос.

Подсказки: я почти всегда использую SystemRandom, чтобы вы могли распараллеливать более уверенно. Там могут быть более быстрые способы, но производительность не была видна мне в спецификации. Печатные издания, конечно же, спрятаны, поскольку в лучшем случае это образование. НТН

Update: Прочитав О.П. комментарий об изменении только часть строк, чтобы сохранить некоторое сходство, можно обменивать выше функции 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'"} 

При вызове этой функции вместо другого.

Смежные вопросы