-3

我有 python 脚本的问题。当我尝试使用一些参数运行它时,出现以下错误:

  print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)
UnboundLocalError: local variable 'fuzzables' referenced before assignment

我不是蟒蛇人;有人能帮我吗?

编码:

def main():
    form_stack = []
    parser = argparse.ArgumentParser('crawl')
    parser.add_argument('url', type=str, help='Target URL')
    parser.add_argument('-s', '--strict', action='store_true', help='Strict Mode')
    args = parser.parse_args()

    target = get_final_url(args.url)
    ltarget = [target]

    if args.strict:
        br = Browser(qapp=qapp, scope=ltarget, strict_match=target)
    else:
        br = Browser(qapp=qapp, scope=ltarget)

    br.load(target)

    dom_urls = br.get_history(clear=True, verify=True)
    static_urls = br.urls(verify=True)
    static_urls.extend(dom_urls)
    static_urls = list(set(static_urls))

    already = 0

    for url in static_urls:
        already += 1
        if len(static_urls) >= 128:
            break

        try:
            br.load(url, retries=2)
        except BrowserTimeout, e:
            continue

        form_stack.extend(br.forms())
        temporaries = br.urls(verify=True)

        map(lambda x: static_urls.append(x), temporaries)
        dom_urls = br.get_history(clear=True, verify=True)
        s_urls = br.urls(verify=True)
        s_urls.extend(dom_urls)
        s_urls = list(set(s_urls))
        static_urls.extend(s_urls)
        static_urls = list(set(static_urls))
        static_urls = map(make_dummy_url, static_urls)
        fuzzables, hashsums = [], []

        for form in form_stack:
            if form['hashsum'] in hashsums:
                continue
            else:
                hashsums.append(form['hashsum'])

            method = form.get('method', 'POST')
            action = form.get('action', '')
            headers = form.get('headers')
            cookies = form.get('cookies')
            data = unquote(urlencode(form.get('fields', {})))
            action = action.toString() if type(action) != str else action

            if type(data) == str and "__PAYLOAD__" not in data:
                data = parse_qsl(data)
                [data.update(set_payload(x)) for x in data.keys()]
                data = unquote(urlencode(data))

            method = method.upper()
            vhost = urlparse(action).hostname
            fuzzable = Fuzzable(method, action, data, cookies, headers, vhost)
            fuzzables.append(fuzzable)

        for url in static_urls:
            url = url.toString() if type(url) != str else url
            uu = urlparse(url)
            qsl = urlparse(url)
            qsl = parse_qsl(uu.query)

            [qsl.update(set_payload(x)) for x in qsl.keys()]
            qsl = urlencode(qsl)

            qq = "?%s" %qsl
            qq = "" if qq == "?" else qq
            url = "%s://%s%s%s" %(uu.scheme, uu.netloc, uu.path, qq)

            if "__PAYLOAD__" not in url:
                continue

            cookies = br.get_plain_cookies()
            vhost = urlparse(url).hostname
            fields = ""
            headers = {}
            fuzzable = Fuzzable("GET", url, fields, cookies, headers, vhost)
            fuzzables.append(fuzzable)

    """
    fu = urlparse(target)
    path = fu.path
    query = parse_qsl(fu.query)
    [query.update(set_payload(x)) for x in query.keys()]
    query = unquote(urlencode(query))
    rqury = "?%s" %query
    rqury = "" if rqury == "?" else rqury
    temporary_url = "%s://%s%s%s" %(fu.scheme, fu.netloc, path, rqury)
    fields = ""
    cookies = br.get_plain_cookies()
    vhost = urlparse(target).hostname
    headers = {'host': fu.hostname}
    fuzzable = Fuzzable("GET", temporary_url, fields, cookies, headers, vhost)
    fuzzables.append(fuzzable)
    """

    br.close()
    del br

    print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)
4

3 回答 3

1

fuzzables仅在循环中分配给:

for url in static_urls:
    # ...
    if len(static_urls) >= 128:
        break

    # ...

    fuzzables, hashsums = [], []

如果static_urls为空或包含超过 128 个项目,则永远不会到达分配行,并且fuzzables保持未绑定。

如果您想保证它被绑定,请在该循环fuzzables 之外分配一些东西。

浏览该代码,您可能也不想fuzzables为每个条目创建一个新的空static_urls条目。

于 2013-12-11T17:41:43.717 回答
1

鉴于注释中链接的脚本,如果static_urls是一个空列表,则不会对 进行任何赋值fuzzables,因此在引用时该变量是未定义的。

您可以将fuzzables = []分配移到static_urls循环之外。

于 2013-12-11T17:42:30.160 回答
-1

错误消息似乎表明了问题。fuzzables在使用它之前,您需要分配一些东西。

例如:

fuzzables = #something
于 2013-12-11T17:40:41.270 回答