T09 · Insecure Skill Coding Practices
- Location
safebooru_fetcher.py:127- Finding
Unvalidated API-Provided Download URLs Permit Server-Side Request Forgery
- Content
View full analysis
List[Post]: pid = max(0, int(page) - 1) url = f"{POST_DAPI}&tags={quote(tags_expr)}&limit={int(limit)}&pid={pid}" r = http_get(url) if not r.text.strip(): return [] data = r.json() out: List[Post] = [] for item in data: fu = item.get("file_url") pid_ = item.get("id") if not fu or pid_ is None: continue out.append( Post( id=int(pid_), file_url=str(fu), preview_url=item.get("preview_url"), sample_url=item.get("sample_url"), rating=item.get("rating"), score=item.get("score"), ) ) return out ``` ```python def download_file(url: str, out_path: str, *, timeout: int = 60, retries: int = 3) -> None: def candidates(u: str) -> List[str]: parts = urlsplit(u) p = parts.path alts = [u] if p.lower().endswith(".jpg"): alts.append(urlunsplit((parts.scheme, parts.netloc, p[:-4] + ".png", parts.query, parts.fragment))) elif p.lower().endswith(".png"): alts.append(urlunsplit((parts.scheme, parts.netloc, p[:-4] + ".jpg", parts.query, parts.fragment))) return alts last_err: Optional[str] = None for cand in candidates(url): for attempt in range(retries): try: r = requests.get(cand, timeout=timeout, headers={"User-Agent": DEFAULT_UA}) if r.status_code == 404: last_err = "HTTP 404" break if r.status_code != 200: last_err = f"HTTP {r.status_code}" _sleep_backoff( ...[truncated 1906 chars]- Remediation
View remediation
