x
Skip to main content

SSRF Protection

What is SSRF and why does it matter?

SSRF (Server-Side Request Forgery) is when someone tricks your server into making HTTP requests on their behalf - to your internal network, cloud metadata endpoints, or other places they shouldn't be able to reach.

In Stirling PDF, the risk is tools like URL to PDF: a user could supply http://192.168.1.1/admin or http://169.254.169.254/ and your server would fetch it. For self-hosted deployments on a private network, that's a real concern.

SSRF protection is enabled by default at MEDIUM level. For most deployments, you don't need to touch it.

warning

The URL to PDF feature is disabled by default (system.enableUrlToPDF: false) due to the SSRF risks described above. It is intended for internal use only and should not be exposed externally. If you enable it, make sure SSRF protection is properly configured.


Settings

All settings are under system.html.urlSecurity in settings.yml.

SettingDefaultDescription
enabledtrueMaster on/off switch
levelMEDIUMOFF, MEDIUM, or MAX - see below
allowedDomains[]Domains to always allow
blockedDomains[]Domains to always block
internalTlds.local, .internal, .corp, .homeTLD suffixes treated as internal
blockPrivateNetworkstrueBlock RFC1918 private IP ranges
blockLocalhosttrueBlock 127.x / ::1
blockLinkLocaltrueBlock 169.254.x.x / fe80::
blockCloudMetadatatrueBlock AWS/GCP/Azure/Oracle/IBM metadata IPs

Protection levels

MEDIUM (default) - Blocks private IPs, localhost, cloud metadata, and internal TLDs. Public internet URLs are allowed by default.

MAX - Only URLs explicitly listed in allowedDomains are allowed. Everything else is blocked. Unlike MEDIUM, subdomain matching is not supported in MAX mode - each domain and subdomain must be listed individually. Use this if you know exactly which external domains your users need.

OFF - No SSRF checking at all. Only appropriate if you have network-level controls elsewhere.

Domain allow and block lists

The allowedDomains and blockedDomains settings work alongside whichever protection level you choose.

  • allowedDomains - When set at MEDIUM level, only these domains (and their subdomains) are permitted in addition to the default public-internet access. At MAX level, this is the exclusive list of permitted domains (no subdomain matching).
  • blockedDomains - Domains to always deny, regardless of level. Uses exact matching - blocking example.com will not block sub.example.com.