コード例 #1
0
    def is_valid_result(result):
        if not isinstance(result, dict):
            return False

        for key, value in result.items():
            if (not util.is_ipv4(key)) and (not util.is_ipv6(key)):
                return False

            if ((not isinstance(value, float)) and (not isinstance(value, int))
                    and (not isinstance(value, str))):
                return False
        return True
コード例 #2
0
    def is_valid_result(result):
        def check_name(node: dict):
            if "name" in node and (not isinstance(node["name"], str)):
                return False
            return True

        def check_cpes(node: dict):
            if "cpes" in node:
                if (not isinstance(node["cpes"], list)):
                    return False
                for cpe in node["cpes"]:
                    if not isinstance(cpe, str):
                        return False
            return True

        def check_protocol(protocol: str):
            nonlocal value

            if protocol in value:
                if not isinstance(value, dict):
                    return False

                for portid, port_node in value[protocol].items():
                    if (not isinstance(portid, str)) and (not isinstance(
                            portid, int)):
                        return False

                    if isinstance(port_node, list):
                        items = port_node
                    else:
                        items = [port_node]

                    for port in items:
                        if not isinstance(port, dict):
                            return False
                        if not check_name(port):
                            return False
                        if not check_cpes(port):
                            return False
                        if "service" in port and not isinstance(
                                port["service"], str):
                            return False
            return True

        if not isinstance(result, dict):
            return False

        for key, value in result.items():
            if (not util.is_ipv4(key)) and (not util.is_ipv6) and (not key
                                                                   == "trust"):
                return False

            if (key == "trust" and (not isinstance(value, float))
                    and (not isinstance(value, float))
                    and (not isinstance(value, str))):
                return False

            if not isinstance(value, dict):
                return False

            if "os" in value:
                if isinstance(value["os"], list):
                    items = value["os"]
                else:
                    items = [value["os"]]

                for item in items:
                    if not isinstance(item, dict):
                        return False
                    if not check_name(item):
                        return False
                    if not check_cpes(item):
                        return False

            if not check_protocol("tcp"):
                return False

            if not check_protocol("udp"):
                return False

        return True
コード例 #3
0
    def is_valid_result(result):
        if not isinstance(result, dict):
            return False

        # check every entry for every IP
        for key, value in result.items():
            if (not util.is_ipv4(key)) and (not util.is_ipv6(key)):
                return False

            if not isinstance(value, dict):
                return False

            # check all hosts for every port
            for portid_str, host_group in value.items():
                if not isinstance(portid_str, str):
                    return False
                # check validity of port number
                try:
                    portid = int(portid_str)
                except ValueError:
                    return False
                if not (1 <= portid <= 65535):
                    return False

                if not isinstance(host_group, dict):
                    return False

                # check all pages available for every host, indexed by status codes
                for webhost, node in host_group.items():
                    for status_code_str, pages in node.items():
                        # check validity of status code
                        if not isinstance(status_code_str, str):
                            return False
                        try:
                            status_code = int(status_code_str)
                        except ValueError:
                            return False
                        if not (100 <= status_code < 600):
                            return False

                        # check validity of every web page node
                        for path, page_info in pages.items():
                            if not path.startswith("/"):
                                return False

                            # check validity of keys and their node structure
                            for page_key in page_info:
                                if page_key in ("GET", "POST", "cookies",
                                                "instances"):
                                    if not isinstance(page_info[page_key],
                                                      list):
                                        return False
                                elif not page_key.startswith("misc_info"):
                                    return False

                            # check validity of every instance
                            if "instances" in page_info:
                                for instance in page_info["instances"]:
                                    # check validity of keys and their node structure
                                    if any(ikey not in ("GET", "POST",
                                                        "cookies")
                                           for ikey in instance):
                                        return False
                                    for param_key in ("GET", "POST",
                                                      "cookies"):
                                        if param_key in instance and not isinstance(
                                                instance[param_key], dict):
                                            return False
                                        for k, v in instance[param_key].items(
                                        ):
                                            if not isinstance(k, str):
                                                return False
                                            if not isinstance(v, str):
                                                return False

        return True