requests-hardened
requests-hardened is a library that overrides the default behaviors of the requests library, and adds new security features.
Installation
The project is available on PyPI:
pip install requests-hardened
Features
SSRF Filters: blocks private and loopback IP ranges.
HTTP Redirects: can be used safely alongside the SSRF filter feature.
Proxy Support: proxies can be used in combination with SSRF Filters for a defense in depth.
Handy Overrides of Defaults: allows to enforce secure defaults globally, such as to mitigate DoS attacks.
Overrides of Defaults
This library allows to override some default values from the requests library that can have a security impact:
Config.never_redirect = False always reject HTTP redirects
Config.default_timeout = (2, 10) sets the default timeout value when no value or None is passed
Config.user_agent_override = None optional config to override User-Agent header. When set to None, requests library will set its default user-agent.
SSRF Filters
A SSRF IP filter can be used to reject HTTP(S) requests targeting private and loopback IP addresses.
Settings:
Config.ip_filter_enable whether or not to filter the IP addresses
ip_filter_allow_loopback_ips whether or not to allow loopback IP addresses
Proxy Support
The SSRF IP filter’s behavior with proxies are as follows:
Proxy’s IP Address: does not block private and loopback IP addresses (no filtering). Instead, the filter assumes that the proxy URL is never tainted with untrusted user input.
Target IP Address (Tunneled HTTP Requests): by default, the tunneled requests are filtered for potential SSRF attacks.
Protocols Supported: SOCKS4, SOCKS5, HTTP, and HTTPS proxy server protocols are supported.
Example Usage:
from requests_hardened import Config, Manager
http_manager = Manager(
Config(
default_timeout=(2, 10),
never_redirect=False,
# Enable SSRF IP filter
ip_filter_enable=True,
ip_filter_allow_loopback_ips=False,
)
)
# List of proxies
proxies = {
"https": "socks5://127.0.0.1:8888",
"http": "socks5://127.0.0.1:8888",
}
# Sends the HTTP request using the proxy
resp = http_manager.send_request("GET", "https://example.com", proxies=proxies)
print(resp)
Full Example
from requests_hardened import Config, Manager
# Creates a global "manager" that can be used to create ``requests.Session``
# objects with hardening in place.
http_manager = Manager(
Config(
default_timeout=(2, 10),
never_redirect=False,
ip_filter_enable=True,
ip_filter_allow_loopback_ips=False,
user_agent_override=None
)
)
# Sends an HTTP request without re-using ``requests.Session``:
resp = http_manager.send_request("GET", "https://example.com")
print(resp)
# Sends HTTP requests with reusable ``requests.Session``:
with http_manager.get_session() as sess:
sess.request("GET", "https://example.com")
sess.request("POST", "https://example.com", json={"foo": "bar"})
Release files for requests-hardened 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| requests_hardened-1.3.0.tar.gz | 7.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| requests_hardened-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 16.7 kB
Release files / requests_hardened-1.3.0.tar.gz
| Download URL | requests_hardened-1.3.0.tar.gz |
|---|---|
| Size | 7.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9c1c7ade61354a175b24f4dd835997e4d2a9db8acf17b2f9ea2aca8b3643e0aa
|
|
BLAKE2b-256 checksum How to use checksums |
4f90196175b8223e82d148b1bf9808c6292a4013982f91f82434d27d2bead47f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / requests_hardened-1.3.0-py3-none-any.whl
| Download URL | requests_hardened-1.3.0-py3-none-any.whl |
|---|---|
| Size | 9.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8eb300a66c8b81fe7562dc2910f4a58c72d8445e2db9d66eb25cb5bca3e5572d
|
|
BLAKE2b-256 checksum How to use checksums |
a0694f4f89777a107141239dc352d33c5bcf2a397fee5683d5059b6a263c0fb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency log