प्रोडक्शन में किसी Node API को मज़बूत बनाएँ: सही CORS, रेट लिमिटिंग, सुरक्षा हेडर, और मुख्य OWASP API जोखिमों के विरुद्ध बचाव।
इस पाठ को Kodokon में खोलेंOWASP API के लिए समर्पित एक टॉप 10 बनाए रखता है। तीन प्रमुख जोखिम: BOLA (Broken Object Level Authorization - किसी id को बदलकर किसी दूसरे उपयोगकर्ता के ऑब्जेक्ट तक पहुँचना), Broken Authentication (खराब तरीके से सत्यापित टोकन, कमज़ोर सीक्रेट), और Unrestricted Resource Consumption (दर, आकार या समय पर कोई सीमा नहीं)। ध्यान दें कि तीनों में से कोई भी किसी लाइब्रेरी को इंस्टॉल करने से ठीक नहीं होता: ये आपके डिज़ाइन के गुण हैं। आइए सर्वव्यापी तंत्र से शुरू करें: CORS, रेट लिमिटिंग, और हेडर।
import { createServer } from "node:http";
const allowed = new Set(["https://app.example.com"]);
const server = createServer((req, res) => {
const origin = req.headers.origin;
if (origin && allowed.has(origin)) {
res.setHeader(
"Access-Control-Allow-Origin",
origin,
);
res.setHeader("Vary", "Origin");
}
if (req.method === "OPTIONS") {
res.setHeader(
"Access-Control-Allow-Methods",
"GET,POST,PUT,DELETE",
);
res.setHeader(
"Access-Control-Allow-Headers",
"content-type,authorization",
);
res.setHeader("Access-Control-Max-Age", "86400");
res.writeHead(204).end();
return;
}
res.setHeader("Content-Type", "application/json");
res.end(JSON.stringify({ ok: true }));
});
server.listen(3000);स्पष्ट रूप से समझें कि CORS क्या नहीं है: सर्वर की सुरक्षा। curl या कोई थर्ड-पार्टी बैकएंड इन हेडर को पूरी तरह अनदेखा कर देता है; केवल ब्राउज़र ही इन्हें लागू करता है, अपने उपयोगकर्ताओं की रक्षा के लिए। तीन विशेषज्ञ नियम: किसी allowlist से सटीक origin लौटाएँ (कभी भी आँख मूँदकर Origin हेडर की नकल न करें), Vary: Origin जोड़ें ताकि आप बीच के कैश को दूषित न करें, और जान लें कि जैसे ही रिक्वेस्ट कुकीज़ (credentials) साथ ले जाती है, वैसे ही * वाइल्डकार्ड को ब्राउज़र अस्वीकार कर देते हैं।
const WINDOW_MS = 60_000;
const LIMIT = 100;
const hits = new Map();
function check(ip) {
const now = Date.now();
const entry = hits.get(ip);
if (!entry || now - entry.start >= WINDOW_MS) {
hits.set(ip, { start: now, count: 1 });
return { ok: true, remaining: LIMIT - 1 };
}
entry.count += 1;
const remaining = Math.max(LIMIT - entry.count, 0);
return { ok: entry.count <= LIMIT, remaining };
}
console.log(check("203.0.113.7"));सुरक्षा हेडर कुछ ही लाइनों की लागत में हमलों की पूरी-पूरी श्रेणियों को रोक देते हैं: HSTS भविष्य की विज़िट के लिए HTTPS को बाध्य करता है, X-Content-Type-Options: nosniff ब्राउज़र को किसी MIME टाइप का अनुमान लगाने से रोकता है, और एक प्रतिबंधात्मक CSP (default-src 'none') किसी API प्रतिक्रिया के ब्राउज़र में गलती से रेंडर हो जाने के दुरुपयोग को निष्प्रभावी कर देता है। आपके स्टैक को उजागर करने वाला कोई भी हेडर भी हटा दें: Express डिफ़ॉल्ट रूप से X-Powered-By जोड़ता है - इसे app.disable('x-powered-by') से बंद करें।
function setSecurityHeaders(res) {
res.setHeader(
"Strict-Transport-Security",
"max-age=63072000; includeSubDomains",
);
res.setHeader("X-Content-Type-Options", "nosniff");
res.setHeader(
"Content-Security-Policy",
"default-src 'none'; frame-ancestors 'none'",
);
res.setHeader("Cache-Control", "no-store");
}
export { setSecurityHeaders };