পর্ব ৬-এ Worker দিয়ে একটা প্রক্সি API বানিয়েছিলাম, যা Firebase-এর সিক্রেট সুরক্ষিত রাখে। কিন্তু সিক্রেট সুরক্ষা যথেষ্ট না — কেউ চাইলে একই এন্ডপয়েন্টে সেকেন্ডে হাজারবার রিকোয়েস্ট পাঠিয়ে সার্ভার আটকে দিতে পারে (বট, স্ক্র্যাপার, বা এমনকি একটা বাগযুক্ত ফ্রন্টএন্ড কোড)। এই পর্বে শিখব Rate Limiting দিয়ে অতিরিক্ত রিকোয়েস্ট ঠেকানো, আর Cloudflare-এর WAF (Web Application Firewall) কীভাবে কাজ করে।
Rate Limiting কী এবং কেন দরকার
Rate Limiting মানে — একটা নির্দিষ্ট সময়ে একজন ইউজার (বা একটা IP) থেকে কতগুলো রিকোয়েস্ট আসতে পারবে তার একটা সীমা বেঁধে দেওয়া। এটা ছাড়া —
- একটা বাগযুক্ত ফ্রন্টএন্ড লুপ আপনার Firebase RTDB-এর ফ্রি কোটা (Firebase এর হাতেখড়ি পর্ব ১২) মুহূর্তেই শেষ করে দিতে পারে
- বট দিয়ে বারবার সাইন আপ ফর্ম সাবমিট করে স্প্যাম অ্যাকাউন্ট তৈরি হতে পারে
- কেউ ইচ্ছাকৃতভাবে সার্ভার ওভারলোড করে সাইট বন্ধ করে দিতে পারে (DDoS-এর ছোট সংস্করণ)
Dashboard দিয়ে Rate Limiting সেট করা
কোনো কোড ছাড়াই Cloudflare Dashboard থেকে একটা নিয়ম বসানো যায়।
- Security → WAF → Rate limiting rules-এ যান
- Create rule চাপুন
- একটা শর্ত ঠিক করুন — যেমন URL path
/api/*এর সাথে মেলে - সীমা ঠিক করুন — যেমন "একই IP থেকে ১০ সেকেন্ডে ২০টার বেশি রিকোয়েস্ট এলে ব্লক করো"
- Action বেছে নিন — Block, Challenge (একটা ক্যাপচা দেখানো), বা শুধু Log করা
Worker কোডে নিজস্ব Rate Limiting
Dashboard-এর নিয়মের পাশাপাশি, KV (পর্ব ৮) ব্যবহার করে Worker-এর ভেতরেই কাস্টম rate limiting লজিক লেখা যায় — যেমন একজন নির্দিষ্ট ইউজার (Auth UID দিয়ে) মিনিটে কতবার একটা অ্যাকশন করতে পারবে তা নিয়ন্ত্রণ করা।
export default {
async fetch(request, env, ctx) {
const ip = request.headers.get("CF-Connecting-IP"); // ইউজারের প্রকৃত IP
const key = `ratelimit:${ip}`;
const current = await env.SITE_SETTINGS.get(key);
const count = current ? parseInt(current) : 0;
if (count >= 10) {
return new Response("অনেক বেশি রিকোয়েস্ট, একটু পর চেষ্টা করুন", { status: 429 });
}
// কাউন্ট বাড়ানো, ৬০ সেকেন্ড পর নিজে থেকে রিসেট (পর্ব ৮-এর expirationTtl)
await env.SITE_SETTINGS.put(key, String(count + 1), { expirationTtl: 60 });
// আসল কাজ
return new Response("রিকোয়েস্ট সফল হয়েছে");
},
};
এখানে CF-Connecting-IP — এটা Cloudflare-এর একটা বিশেষ হেডার, যা ইউজারের প্রকৃত IP address দেয় (নিয়মিত request.headers.get("X-Forwarded-For")-এর চেয়ে বেশি নির্ভরযোগ্য, কারণ এটা Cloudflare নিজে যাচাই করে বসায়)। HTTP স্ট্যাটাস 429 মানে "Too Many Requests" — এটাই এই পরিস্থিতির স্ট্যান্ডার্ড কোড।
WAF কী — এক নজরে
WAF (Web Application Firewall) হলো Cloudflare-এর একটা লেয়ার, যা রিকোয়েস্ট আপনার সার্ভার পর্যন্ত পৌঁছানোর আগেই পরিচিত আক্রমণের প্যাটার্ন (SQL Injection চেষ্টা, XSS, পরিচিত bad bot signature) ফিল্টার করে দেয়। Cloudflare-এর ফ্রি প্ল্যানেও একটা বেসিক WAF বিল্ট-ইন থাকে, কোনো সেটআপ ছাড়াই।
Managed Rules চালু করা
- Security → WAF → Managed rules-এ যান
- Cloudflare-এর ডিফল্ট rule set (যেমন Cloudflare Managed Ruleset) চালু করুন
- প্রতিটা নিয়ম আলাদাভাবে "Log" বা "Block" মোডে রাখা যায় — শুরুতে Log মোডে রেখে দেখা ভালো, কোনো বৈধ রিকোয়েস্ট ভুলবশত ব্লক হচ্ছে কিনা যাচাই করতে
Custom WAF Rule — নিজের নিয়ম বানানো
নির্দিষ্ট প্রয়োজনে নিজের নিয়ম বানানো যায় — যেমন শুধু নিজের ফ্রন্টএন্ড ডোমেইন থেকেই API-তে অ্যাক্সেস দেওয়া।
- Security → WAF → Custom rules-এ যান
- একটা এক্সপ্রেশন লিখুন, যেমন —
(http.host eq "api.arifstack.com" and not http.referer contains "arifstack.com") - Action: Block
এই নিয়মটা বলছে — যদি রিকোয়েস্ট api.arifstack.com-এ আসে, কিন্তু referer arifstack.com না হয়, তাহলে ব্লক করো — এতে সরাসরি API URL কেউ ব্রাউজারে/অন্য সাইট থেকে কল করলে আটকে যায়।
Bot Fight Mode
Cloudflare-এর ফ্রি প্ল্যানেই একটা সহজ টগল আছে — Security → Bots → Bot Fight Mode। এটা চালু করলে পরিচিত খারাপ বট (স্ক্র্যাপার, স্প্যাম বট) স্বয়ংক্রিয়ভাবে চ্যালেঞ্জ করা হয়, কোনো কাস্টম নিয়ম লেখা ছাড়াই।
ইন্টারেক্টিভ — Rate Limiter সিমুলেশন
নিচে বারবার "রিকোয়েস্ট পাঠাও" চেপে দেখো কীভাবে ১০টার পর 429 রেসপন্স আসতে শুরু করে।
ভালো অভ্যাস
- Managed Rules প্রথমে Log মোডে চালু করুন — সরাসরি Block করলে হঠাৎ বৈধ ইউজারও আটকে যেতে পারে
- Rate limit সীমা বাস্তবসম্মত রাখুন — খুব কড়া সীমা বৈধ ইউজারদেরও বিরক্ত করবে, খুব ঢিলা সীমা সুরক্ষা দেবে না
- সেনসিটিভ এন্ডপয়েন্টে (সাইন আপ, পাসওয়ার্ড রিসেট) কড়া rate limit রাখুন — Firebase এর হাতেখড়ি পর্ব ২-এর
auth/too-many-requests-এর মতোই ধারণা, Cloudflare লেয়ারেও একই সুরক্ষা যোগ করা যায়
নিজে চেষ্টা করো
Exercise:
- Dashboard-এ গিয়ে Bot Fight Mode চালু করো।
- নিজের একটা রুটে (যেমন
/api/*) একটা Rate limiting rule বানাও। - উপরের KV-ভিত্তিক rate limiting কোড নিজের Worker-এ যোগ করো, একই IP থেকে বারবার রিকোয়েস্ট পাঠিয়ে ৪২৯ রেসপন্স আসছে কিনা যাচাই করো।
- নিজের API-তে একটা Custom WAF rule বানাও, যাতে শুধু নিজের ডোমেইন থেকে referer এলেই অ্যাক্সেস মেলে — প্রথমে Log মোডে রেখে টেস্ট করো।
পরের পর্বে যা থাকছে
পরের পর্বে আমরা শিখব Analytics ও Monitoring — Cloudflare-এর বিল্ট-ইন Web Analytics, Workers-এর লগ কীভাবে দেখতে হয়, আর সাইটের স্বাস্থ্য বোঝার জন্য কোন মেট্রিকগুলো গুরুত্বপূর্ণ।