diff --git a/tools/http-framework-test.yaml b/tools/http-framework-test.yaml index 5243ecec..dd8537a3 100644 --- a/tools/http-framework-test.yaml +++ b/tools/http-framework-test.yaml @@ -445,7 +445,7 @@ args: parser.add_argument("--url", required=True) parser.add_argument("--method", default="GET") parser.add_argument("--data", default="") - parser.add_argument("--headers", default="") + parser.add_argument("--headers", default="", type=str) parser.add_argument("--cookies", default="") parser.add_argument("--user-agent", dest="user_agent", default="") parser.add_argument("--proxy", default="") @@ -489,7 +489,30 @@ args: prepared_url = smart_encode_url(args.url) if args.auto_encode_url else args.url method = (args.method or "GET").upper() - headers = httpx.Headers(parse_headers(args.headers)) + # 处理 headers:支持字典(JSON字符串)和字符串格式 + # 框架会将 object 类型序列化为 JSON 字符串传递 + headers_list = [] + if args.headers: + headers_str = args.headers.strip() + # 优先尝试解析为 JSON(框架传递的字典会被序列化为 JSON) + if headers_str.startswith("{") or headers_str.startswith("["): + try: + parsed = json.loads(headers_str) + if isinstance(parsed, dict): + # 字典格式:直接转换为 (key, value) 元组列表 + headers_list = [(str(k).strip(), str(v).strip()) for k, v in parsed.items()] + elif isinstance(parsed, list): + # 数组格式:使用原有的 parse_headers 函数处理 + headers_list = parse_headers(headers_str) + else: + headers_list = parse_headers(headers_str) + except (json.JSONDecodeError, ValueError): + # JSON 解析失败,回退到原有的字符串解析逻辑 + headers_list = parse_headers(headers_str) + else: + # 非 JSON 格式,使用原有的字符串解析逻辑(向后兼容) + headers_list = parse_headers(headers_str) + headers = httpx.Headers(headers_list) if args.user_agent: headers["User-Agent"] = args.user_agent @@ -724,8 +747,8 @@ parameters: required: false flag: "--data" - name: "headers" - type: "string" - description: "自定义请求头(JSON字典、行分隔或分号分隔的 Header: Value 格式)" + type: "object" + description: "自定义请求头(字典格式,如 {\"X-Custom\": \"value\"})" required: false flag: "--headers" - name: "cookies" diff --git a/tools/http-intruder.yaml b/tools/http-intruder.yaml index feb26dc2..99442419 100644 --- a/tools/http-intruder.yaml +++ b/tools/http-intruder.yaml @@ -17,20 +17,46 @@ args: url = sys.argv[1] method = (sys.argv[2] or "GET").upper() location = (sys.argv[3] or "query").lower() - params_json = sys.argv[4] if len(sys.argv) > 4 else "{}" + params_input = sys.argv[4] if len(sys.argv) > 4 else "{}" payloads_json = sys.argv[5] if len(sys.argv) > 5 else "[]" max_requests = int(sys.argv[6]) if len(sys.argv) > 6 and sys.argv[6] else 0 try: - params_template = json.loads(params_json) if params_json else {} + # 框架会将 object 类型序列化为 JSON 字符串传递 + # sys.argv 中的参数都是字符串,需要解析 JSON + if params_input and params_input.strip(): + params_template = json.loads(params_input) + if not isinstance(params_template, dict): + sys.stderr.write("参数模板必须是字典格式\n") + sys.exit(1) + else: + params_template = {} except json.JSONDecodeError as exc: - sys.stderr.write(f"参数模板解析失败: {exc}\n") + sys.stderr.write(f"参数模板解析失败(需要 JSON 字典格式): {exc}\n") sys.exit(1) try: - payloads = json.loads(payloads_json) - except json.JSONDecodeError as exc: - sys.stderr.write(f"载荷解析失败: {exc}\n") + # 框架会将 array 类型转换为逗号分隔的字符串(见 formatParamValue) + # 但为了兼容性,也支持 JSON 数组格式 + if payloads_json and payloads_json.strip(): + payloads_str = payloads_json.strip() + # 优先尝试解析为 JSON 数组 + if payloads_str.startswith("["): + try: + payloads = json.loads(payloads_str) + except json.JSONDecodeError: + # JSON 解析失败,尝试逗号分隔格式 + payloads = [item.strip() for item in payloads_str.split(",") if item.strip()] + else: + # 逗号分隔的字符串(框架的 array 类型默认格式) + payloads = [item.strip() for item in payloads_str.split(",") if item.strip()] + if not isinstance(payloads, list): + sys.stderr.write("载荷必须是数组格式\n") + sys.exit(1) + else: + payloads = [] + except (json.JSONDecodeError, ValueError) as exc: + sys.stderr.write(f"载荷解析失败(需要 JSON 数组或逗号分隔格式): {exc}\n") sys.exit(1) if not isinstance(payloads, list) or not payloads: @@ -110,14 +136,14 @@ parameters: position: 2 format: "positional" - name: "params" - type: "string" - description: "参数模板(JSON字典),指定要模糊的键及默认值" + type: "object" + description: "参数模板(字典格式),指定要模糊的键及默认值,如 {\"id\": \"1\", \"name\": \"test\"}" required: true position: 3 format: "positional" - name: "payloads" - type: "string" - description: "载荷列表(JSON数组)" + type: "array" + description: "载荷列表(数组格式),如 [\"test1\", \"test2\", \"test3\"]" required: true position: 4 format: "positional"