T09 · Insecure Skill Coding Practices
- Location
scripts/read_douyin.py:32- Finding
Insufficient URL Validation Permits Server-Side Request Forgery
- Content
View full analysis
str: """从分享文本中解析视频 ID。""" urls = re.findall(r"https?://[^\s\u201c\u201d]+", text) if not urls: raise ValueError("未在输入中找到链接") url = urls[0].rstrip('/') m = re.search(r'/video/(\d+)', url) if m: return m.group(1) m = re.search(r'(\d{15,})', url) if m: return m.group(1) # 短链:跟随 302 取真实地址 resp = requests.get(url, headers={"User-Agent": UA_MOBILE}, allow_redirects=True, timeout=20) m = re.search(r'/video/(\d+)', resp.url) if not m: m = re.search(r'(\d{15,})', resp.url) if not m: raise ValueError(f"无法从 {resp.url} 解析视频 ID") return m.group(1) ``` `scripts/capture_frames.py:42-63`: ```python def resolve_target(text: str) -> dict: """把用户输入解析成 (要打开的页面地址, 平台, 视频 ID)。""" url = first_url(text) if "douyin.com" in url: m = re.search(r"/video/(\d+)", url) or re.search(r"(\d{15,})", url) if m: vid = m.group(1) else: # 短链,跟随 302 try: resp = requests.get(url, headers={"User-Agent": UA_MOBILE}, allow_redirects=True, timeout=20) m = re.search(r"/video/(\d+)", resp.url) or re.search(r"(\d{15,})", resp.url) vid = m.group(1) if m else None except Exception: vid = None if not vid: raise ValueError(f"无法从 {url} 解析抖音视频 ID") return {"page_url": f"https://www.douyin.com/video/{vid}", "platform": "douyin", "video_id": vid, "warmup": "https://www.douyin.com/"} return {"page_url": url, "platform": "generic", "video_id": None, "warmup": None} `` ...[truncated 2841 chars]- Remediation
View remediation
