Implementing Security Best Practices

1. Validating User Input

LibraryUse
zod / valibotType-safe schema validation
joi / ajvJSON Schema validation
Validate at boundaryHTTP, queue, file uploads

2. Sanitizing Input (preventing XSS)

ToolUse
DOMPurifySanitize HTML
Output encodingEscape on render, not on store
CSP headerDefense in depth

3. Preventing SQL Injection

Example: Parameterized query

// SAFE
await pool.query("SELECT * FROM users WHERE id = $1", [id]);
// UNSAFE — string concat
await pool.query(`SELECT * FROM users WHERE id = ${id}`);

4. Using Prepared Statements

DriverApproach
pg{ text, name, values } with name = prepared
mysql2connection.execute(sql, params)
better-sqlite3db.prepare(sql).get(params)

5. Implementing Authentication

MechanismUse
Sessions + cookiesServer-rendered apps
JWTStateless APIs (rotate / short TTL)
OAuth 2 / OIDCThird-party login
Passwordsargon2id (preferred) or bcrypt

6. Implementing Authorization

ModelUse
RBACRoles → permissions
ABACAttribute-based rules
ReBAC (Zanzibar)Relationship graphs
Always check at serverNever trust client

7. Using HTTPS

PracticeDetail
TLS 1.2+ onlyDisable SSLv3 / TLS 1.0
HSTS headerForce HTTPS in browser
Auto-renew certsLet's Encrypt + certbot / acme.sh

8. Implementing Rate Limiting

LibraryDetail
express-rate-limitPer-IP windowed limits
rate-limiter-flexibleRedis-backed, distributed
API gatewayKong, Envoy, NGINX

9. Using Helmet for Security Headers

Example

import helmet from "helmet";
app.use(helmet());
// Sets CSP, X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security, etc.

10. Preventing CSRF

TechniqueDetail
SameSite cookiesSameSite=Lax (default) or Strict
CSRF tokenPer-session synchronizer token
Custom header checkFor JSON APIs

11. Securing Dependencies (npm audit)

CommandUse
npm auditList vulnerabilities
npm audit fixAuto-update where possible
npm audit signaturesVerify package signatures
Dependabot / RenovateAutomated PRs
Snyk / SocketDeeper vuln + supply-chain checks

12. Using Permission Model (--permission flag)

FlagEffect
--permission v20+Enable permission model
--allow-fs-read=<path>Whitelist read paths
--allow-fs-write=<path>Whitelist write paths
--allow-child-processAllow spawning
--allow-workerAllow worker_threads
process.permission.has("fs.read", path)Check at runtime