pub struct UserAgentBinding;Expand description
Binds the session to the User-Agent header.
Threat model, read this before relying on it. UA binding catches only the dumbest hijacking modes: the attacker steals the cookie via log scraping, browser-extension exfiltration, or a prior breach where the UA wasn’t captured, and replays it from a different client. It does not stop:
- XSS / cookie-jacking attacks where the attacker is in the
victim’s browser. The User-Agent is plaintext on every request and
trivially copyable; an attacker who exfiltrates the cookie via a
malicious script or browser extension also has full access to
navigator.userAgent. - Network-level interception where the attacker observes the victim’s traffic (TLS-stripping proxies, compromised CA, captured PCAPs). The UA travels in clear with the cookie.
- Phishing that proxies the victim’s browser to your origin: the proxy forwards the real UA verbatim.
What it is useful for: defense in depth against database/log dumps
where the attacker has cookies but no captured UA, and as a cheap
signal for hijack telemetry. Combine with at least one of: client-IP
/24 binding (acceptable when users don’t roam between networks
often), TLS channel binding (RFC 8471), or a hardware-bound key
(FIDO2). Document the limits to your security reviewers; assuming
UA binding stops cookie theft is a common misreading.
Trait Implementations§
Source§impl Clone for UserAgentBinding
impl Clone for UserAgentBinding
Source§fn clone(&self) -> UserAgentBinding
fn clone(&self) -> UserAgentBinding
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for UserAgentBinding
impl Debug for UserAgentBinding
Source§impl Default for UserAgentBinding
impl Default for UserAgentBinding
Source§fn default() -> UserAgentBinding
fn default() -> UserAgentBinding
Auto Trait Implementations§
impl Freeze for UserAgentBinding
impl RefUnwindSafe for UserAgentBinding
impl Send for UserAgentBinding
impl Sync for UserAgentBinding
impl Unpin for UserAgentBinding
impl UnsafeUnpin for UserAgentBinding
impl UnwindSafe for UserAgentBinding
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.