Node.js ডেভেলপাররা প্রোডাকশনে যে সিকিউরিটি বাগগুলো পাঠিয়ে দেন
গত বছর আমি একটি স্টার্টআপের কোড রিভিউ করেছিলাম। কোডটি দেখতে বেশ পরিষ্কার ছিল। টেস্টগুলোও পাস করেছিল।
তারপর আমি এই লাইনটি দেখতে পাই:
const query = \SELECT * FROM users WHERE email = '${req.body.email}'``
এটি একটি SQL injection বাগ। স্টার্টআপটি ৮ মাস ধরে এটি প্রোডাকশনে চালিয়েছিল। কোনো ডেভেলপার বা CTO এটি ধরতে পারেননি।
এই বাগগুলো অদৃশ্য থাকে কারণ কোডটি কাজ করে। যতক্ষণ না কোনো ব্যবহারকারী ইনপুট ফিল্ডে একটি ক্ষতিকারক কমান্ড টাইপ করছেন, ততক্ষণ এটি ঠিকঠাক কাজ করতে থাকে।
এই ৫টি সাধারণ ভুল করা বন্ধ করুন:
- ইউজার ইনপুটসহ Raw SQL কুয়েরির জন্য template literals ব্যবহার করবেন না। এটি আক্রমণকারীদের আপনার ডাটাবেসে প্রবেশ করার সুযোগ করে দেয়।
- খারাপ:
const query = \SELECT * FROM users WHERE email = '${email}'`` - ভালো: parameterized queries ব্যবহার করুন।
const query = 'SELECT * FROM users WHERE email = $1'db.query(query, [email])
Git-এ সিক্রেট লিক করা ডেভেলপাররা প্রায়ই রিপোজিটরিতে .env ফাইল কমিট করে ফেলেন। এটি আপনার ডাটাবেস URL এবং API key প্রকাশ করে দেয়। সবসময় আপনার .gitignore ফাইলে .env যোগ করুন।
jwt.verify এর পরিবর্তে jwt.decode ব্যবহার করা jwt.decode শুধুমাত্র টোকেনটি পড়ে। এটি টোকেনটি আসল কি না তা যাচাই করে না। যে কেউ একটি ডিকোড করা টোকেন জাল করতে পারে।
- খারাপ:
const user = jwt.decode(token) - ভালো: সবসময় সিগনেচার ভেরিফাই করুন।
const user = jwt.verify(token, process.env.JWT_SECRET)
- auth এন্ডপয়েন্টে rate limiting না থাকা rate limiting না থাকলে, আক্রমণকারীরা brute force-এর মাধ্যমে লক্ষ লক্ষ পাসওয়ার্ড চেষ্টা করতে পারে। লগইন প্রচেষ্টা সীমিত করতে একটি লাইব্রেরি ব্যবহার করুন।
- ভালো: প্রতি ১৫ মিনিটে ১০টি প্রচেষ্টার একটি সীমা যোগ করুন।
- অতিরিক্ত তথ্যসমৃদ্ধ (Verbose) এরর মেসেজ ক্লায়েন্টের কাছে সরাসরি এরর মেসেজ পাঠানো আক্রমণকারীদের আপনার সিস্টেমের ম্যাপ তৈরি করতে সাহায্য করে। তারা আপনার টেবিলের নাম এবং ডাটাবেস টাইপ দেখে
