Skip to content
Constructious

Security statement

What protects the data in Constructious, in plain words, and how each claim is checked. The full threat model and every review decision are in docs/architecture/security-model.md; this page is the summary to give a client or an auditor. Date of this version: 2026-10-24 (Sprint 16).

Who can get in

Control How it works Evidence
Passwords 12+ characters, checked against known breaches (k-anonymity range lookup: only five characters of a hash leave the server), stored only as one-way bcrypt hashes (cost from BCRYPT_ROUNDS, 12) LoginTest, PasswordResetTest
Two-factor Time-based codes are required for Owner, Accountant and Partner (configurable). A password alone opens nothing: every route except sign-out, "who am I" and the two-factor steps refuses it. Codes cannot be replayed; guessing is throttled; recovery codes are single-use and hashed TwoFactorTest, TwoFactorBypassTest (walks every route with a password-only session)
Lockout and rate limits 5 failures lock that account-and-address pair for 1, 2, 4… up to 60 minutes (a stranger cannot lock the real user out); sign-in, uploads, exports, previews and the general API have separate limits LoginTest, SecurityHardeningTest
Sessions cookie sessions (HttpOnly, Secure, SameSite=Lax), idle timeout (default 30 min), absolute limit (12 h), CSRF token on every write SessionIdleTimeout tests, tests/e2e/security.spec.ts (real server refuses a write without the token)
Sensitive actions voiding, role changes, posting opening balances, exporting or pseudonymising a person need the password again; the confirmation is single-use and bound to the session ReauthTest, OpeningBalanceImportTest, PseudonymisationTest

What each person can see

What is recorded

Protection of the data itself

Headers and browser protection

Content-Security-Policy (scripts from the application only, no inline script, no eval), X-Frame-Options: DENY, X-Content-Type-Options, Referrer-Policy, Permissions-Policy on every response, including refusals and errors (TwoFactorBypassTest scans each API route). HSTS over https.

Privacy features

Search for a person, export everything held about them (and nothing about anyone else), pseudonymise them (name and contact detail replaced by a code; amounts, documents and the audit log keep their meaning), retention settings with archiving rather than deletion. Template notice: docs/product/privacy-notice-template.md.

Supply chain and operations

Known limits (accepted, tracked)

See security-model.md sections 22-26. In short: names in past audit rows and notification texts are not rewritten by pseudonymisation; an emailed or downloaded file leaves the system's control; crew members who share a name are one subject in a personal-data request; rate limits are per server (single-server design); the weekly archive job needs a database right that is documented in the deployment guide.

Reporting a problem

Send details to [security contact of the company running the system]. Do not include real personal data in the report.