- image
The name is a confession. BMad_SecureLoadImageURL (display name "~Safe Image URL") is a node that downloads PNG, JPEG, WebP, or SVG from a URL and hands you an IMAGE tensor - and the pack it ships in is called quasi secure load image URL, with a README that opens by admitting it was "vibe-coded through multiple LLMs" and has had no formal security audit. That honesty is refreshing, and you should read it as the actual contract: this is a genuinely careful URL loader, not a promise.
So why reach for it at all? Core ComfyUI gives you LoadImage, which only reads from disk. If your workflow pulls reference images, style refs, or batch inputs from the web, you either download them by hand or use a URL-loading node. The scary part is that "just fetch this URL" is exactly the kind of code that gets people hacked - the ComfyUI_LLMVISION malware incident made clear that no one's going to audit a custom node for you. This pack's whole pitch is that it fetches URLs like it expects the server to be hostile.
How it works
The download is async aiohttp, and the hardening is layered. It only accepts http/https, rejects URLs with embedded credentials, and blocks every private, loopback, link-local, reserved, multicast, and metadata-service address at the IP layer - plus a denylist of cloud metadata hostnames (AWS, GCP, Azure, DigitalOcean, Oracle, Alibaba) as a second belt-and-suspenders layer. DNS is resolved once and pinned per redirect hop, so a hostile server can't swap the IP mid-request (DNS rebinding). TLS is verified with a strict context. Downloads are size-capped with streaming decompression-bomb protection for gzip/deflate/brotli, and the file is cross-checked three ways: extension, Content-Type, and magic bytes. It's over-engineered in the good way.
SVG gets its own gauntlet: parsed with defusedxml, run through a strict tag allowlist, no external url() references, no inline event handlers, no xml-stylesheet, capped at 10,000 elements / depth 100 / 5 MB - then rasterized to a square bitmap with resvg-py. PNG/JPEG/WebP skip straight to PIL.
Inputs and outputs that matter
Only five inputs, and you'll mostly touch two:
- url - the thing to fetch. All the other knobs exist to save you from it.
- max_download_mb (default 20, hard ceiling 100) - the cap before the node refuses.
- require_extension (default off) - if on, a URL without a
.png/.jpg-style extension is rejected even when the server sends a proper Content-Type. Leave it off for signed or CDN URLs that hide their extensions. - svg_size (default 512) - dimensions of the rasterized output; only matters when the source is an SVG, and it's always square.
- max_redirects (default 5) - sane default, lower it if you're jumpy.
The single output, image, is a standard IMAGE tensor. It plugs into anything an image plugs into - VAE encode, a ControlNet preprocessor, IPAdapter, an upscaler.
Installing it
It's published to the Comfy Registry, so the easy route is ComfyUI Manager → search "quasi secure load image url" → Install. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/bmad4ever/comfyui_quasi_secure_load_image_url
cd comfyui_quasi_secure_load_image_url
pip install -e . # pulls aiohttp, defusedxml, brotli, resvg-py
Then restart ComfyUI. No model files, no weights - it's pure code.
Gotchas
- This node targets the modern ComfyUI extension API (
comfy_api, asyncexecute). On older builds that predate it, the node simply won't register - if it doesn't appear in your node list after a restart, your ComfyUI is too old. - SVG without resvg-py: if
resvg_pydidn't install cleanly, the node still loads PNG/JPEG/WebP fine but SVG errors out with a message telling you topip install resvg_py. - SVG text: resvg doesn't use system fonts, so
<text>in an SVG may rasterize as blank or fallback glyphs. Plan around it. - Big sources: anything over 8192×8192 pixels is refused. And a URL with no extension and no Content-Type header is always rejected - that's by design, not a bug.
- The "quasi": no audit, vibe-coded, zero community track record (this page's zero impressions are the proof). Use it for trusted sources, not as your ComfyUI's public internet-facing door - and don't point it at things you wouldn't paste into a browser.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | — | |
| svg_size | INT | 51232–4096 | Dimensions of the rasterized output. |
| max_download_mb | INT | 201–100 | — |
| max_redirects | INT | 50–10 | — |
| require_extension | BOOLEAN | false | If true, URLs without a file extension (e.g., .png, .jpg) are rejected even if a Content-Type header is present. If false, missing extension is allowed but Content-Type must still be provided. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |