Skip to content

Signals

phil/spam-protection-bundle

Each signal is an observation the server makes itself, never a claim the client makes. The inspection raises all of those it finds, in this order.

SignalRaised whenTune with
honeypot_filledThe hidden website_url field holds anything.—
token_missingThe submission carries no token: the form was not rendered here.—
token_forgedThe token's signature does not match, or it belongs to another scope.secret
proof_invalidThe proof of work is missing or wrong. Checked only on a genuine token.proof_of_work
too_fastFewer than timing.minimum seconds since the form was rendered.timing.minimum
token_expiredMore than timing.maximum seconds since the form was rendered.timing.maximum
token_replayedThe token was already submitted. Checked only on a genuine, on-time token.cache_pool
malformedA text is not valid UTF-8, which no browser sends; it is still read for the next four signals, each bad sequence replaced.—
too_longA text holds more characters than allowed; only that many are read for the next three signals.content.maximum_length
too_many_linksA text holds more http://, https:// or www. addresses than allowed, each counted once.content.maximum_links
forbidden_termA text holds a forbidden term as a whole word or a whole sequence of words, without regard to case, accents or punctuation.content.forbidden_terms
gibberishA text has a word of 12 letters or more without a vowel, or 20 letters or more of which fewer than one in eight are vowels (y counts).content.detect_gibberish
rate_limitedThe client submitted the form more often than the limiter allows.rate_limiter

A token is claimed only when it is genuine and on time, so that forged or stale tokens never fill the cache of used ones. The rate limit counts every submission of a request with a client address, held or not, so that a robot cannot reset it by passing the other checks.