pub fn validate_return_url(url: &str) -> boolExpand description
Validate that a return URL is a safe relative path
This function prevents open redirect attacks by ensuring the URL:
- Is URL-decoded to prevent encoding bypasses
- Is a relative path starting with exactly one /
- Does not contain protocol-relative URLs (//) or absolute URLs
- Does not contain backslashes (which some browsers treat as forward slashes)
- Parses correctly as a relative URL
§Security
This function defends against various open redirect attack vectors:
- URL encoding bypasses:
/%2F/evil.com→//evil.com - Protocol-relative URLs:
//evil.com - Absolute URLs:
https://evil.com - Backslash variants:
/\evil.com(some browsers normalize to//evil.com) - Encoded protocols:
/http%3A%2F%2Fevil.com
§Examples
use micromegas_auth::url_validation::validate_return_url;
// Valid relative paths
assert!(validate_return_url("/"));
assert!(validate_return_url("/dashboard"));
assert!(validate_return_url("/path/to/resource?query=value"));
assert!(validate_return_url("/path%20with%20spaces"));
// Invalid: absolute URLs
assert!(!validate_return_url("https://evil.com"));
assert!(!validate_return_url("//evil.com"));
// Invalid: URL-encoded open redirect attempts
assert!(!validate_return_url("/%2F/evil.com"));
assert!(!validate_return_url("/http%3A%2F%2Fevil.com"));
// Invalid: backslash variants
assert!(!validate_return_url("/\\evil.com"));