Security
Atlas Forms includes multiple security layers to protect your forms from abuse.
Origin Validation
Restrict which domains can submit to your forms.
Configuration
example.com, app.example.com)How It Works
Origin or Referer headerexample.com allows www.example.com)Localhost Testing
Testing forms locally requires sandbox mode and a registered IP address.
Why IP Registration?
Localhost origins (http://localhost:3000) are identical for all developers. Without IP validation, anyone who discovers your form ID could submit to your form from their localhost.
By registering your IP, Atlas ensures only your machine can submit to the form during development.
How to Test Locally
Form in SANDBOX mode:
- Your localhost + registered IP → ✅ Allowed
- Other localhost + different IP → ❌ Rejected
Form in LIVE mode:
- Localhost (any IP) → ❌ BlockedIP Registration
Your public IP (detected via Cloudflare) is shown in form settings. Click Register My IP to authorize it.
Common scenarios:
| Scenario | Solution |
|---|---|
| IP changed (new WiFi, VPN) | Click "Register My IP" again |
| Team development | Each team member registers their IP |
| Same office (shared NAT) | Same IP = same org, works automatically |
Optional: Sandbox API Key
For extra security in JavaScript apps, generate a Sandbox API Key:
.env.local:ATLAS_FORM_KEY=sk_sandbox_xyz123...await fetch('https://atlasforms.app/f/abc123', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Atlas-Key': process.env.ATLAS_FORM_KEY
},
body: JSON.stringify({ name: 'Test' })
})This provides two layers of security: IP binding + API key.
When You Go Live
When you switch from Sandbox to Live mode:
This ensures your production form only accepts submissions from real users on real domains.
Error Response
{
"error": "Origin not allowed"
}Rate Limiting
Prevent abuse with per-IP rate limiting.
Default Limits
| Context | Limit |
|---|---|
| Form submissions | 60/minute per IP |
| API requests | 100/minute per API key |
Custom Limits
Configure per-project rate limits in Project Settings → Security.
Rate Limit Headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 55
X-RateLimit-Reset: 2024-01-15T10:31:00ZWhen Limited
{
"error": "Rate limit exceeded. Please try again later.",
"retry_after": 45
}Status code: 429 Too Many Requests
Spam Protection
Honeypot Fields
Add invisible fields that only bots fill out:
<form action="https://atlasforms.app/f/abc123xyz" method="POST">
<!-- Honeypot - hidden from humans -->
<div style="position: absolute; left: -9999px;">
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off">
</div>
<input type="text" name="name" required>
<button type="submit">Send</button>
</form>If _gotcha or _honeypot has a value, the submission is silently accepted but discarded.
Turnstile CAPTCHA
Cloudflare Turnstile provides invisible bot detection:
<form action="https://atlasforms.app/f/abc123xyz" method="POST">
<input type="text" name="name" required>
<div class="cf-turnstile" data-sitekey="0x4AAAAAAA..."></div>
<button type="submit">Send</button>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>IP Blocking
Automatically block IPs that exhibit abusive behavior.
Automatic Blocking
IPs are blocked after repeated violations:
Manual Blocking
Admins can manually block IPs from the security dashboard.
Unblocking
Blocks expire automatically or can be removed manually.
Webhook Security
Signature Verification
All webhooks include HMAC-SHA256 signatures:
X-Webhook-Signature: sha256=abc123...Always verify signatures to prevent spoofed webhooks:
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}Webhook Secrets
Generate a secret in Project Settings → Security → Webhook Secret.
CSRF Protection
The dashboard uses CSRF tokens to prevent cross-site request forgery.
For API integrations:
Data Security
Encryption
Data Retention
GDPR Compliance
Security Headers
Atlas sets security headers on all responses:
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-originAudit Logging
Enterprise plans include security audit logs:
Access logs in Admin → Security → Audit Log.
Reporting Vulnerabilities
Found a security issue? Email security@atlasforms.app.
We appreciate responsible disclosure and will: