নিরাপদ file upload: কী যাচাই করবেন ও কোথায় রাখবেন
File upload সবচেয়ে ঝুঁকিপূর্ণ feature-গুলোর একটি। সতর্ক ডিজাইন একে সাধারণ গুরুতর bug থেকে নিরাপদ feature বানায়।

User-কে ফাইল (avatar, ডকুমেন্ট, ছবি) upload করতে দেওয়া কাজের ও বিপজ্জনক। দুর্বল upload আক্রমণকারীকে আপনার server-এ কোড চালাতে, ক্ষতিকর কনটেন্ট রাখতে, disk ভরাতে বা অন্য user-কে আক্রমণ করতে দিতে পারে।
কী ভুল হতে পারে
- Remote code execution: script ফাইল (
.php,.jsp-এর মতো) এমন জায়গায় সেভ হওয়া যেখানে server সেটি চালায়। - Stored XSS: আপনার domain থেকে দেওয়া HTML বা SVG ফাইল user-দের browser-এ script চালায়।
- Path traversal:
../../config-এর মতো ফাইলের নাম উদ্দিষ্ট folder-এর বাইরে লেখে। - Denial of service: বিশাল ফাইল, অনেক ফাইল, বা gigabyte-এ ফুলে ওঠা "decompression bomb"।
- অন্য user-দের কাছে ছড়ানো malware।
- ফাইল প্রক্রিয়াকারী library-র image parser bug।
ধাপে ধাপে নিরাপদ ডিজাইন
১. Allow-list, কখনো deny-list নয়। শুধু দরকারি ধরন নিন (যেমন JPEG, PNG, WebP, PDF)। বাকি সব প্রত্যাখ্যান করুন।
২. শুধু extension ও Content-Type header যাচাই নয়। দুটোই client নিয়ন্ত্রণ করে। ফাইলের আসল কনটেন্ট (magic byte) যাচাই করুন এবং বিশ্বস্ত library দিয়ে ছবি re-encode করুন, যা লুকানো data-ও সরায়।
৩. User-এর ফাইলের নাম ব্যবহার করবেন না। Random নাম (যেমন UUID) এবং আপনার বাছা স্থির extension তৈরি করুন। আসল নাম শুধু টেক্সট metadata হিসেবে রাখুন।
৪. Web root-এর বাইরে বা object storage-এ রাখুন। ফাইল যেন এমন folder-এ না থাকে যেখানে server কোড চালায়। আরও ভালো: object storage-এ (S3, R2) upload করে আলাদা domain থেকে CDN দিয়ে দিন, যাতে upload করা কনটেন্ট আপনার সাইটের cookie ছুঁতে না পারে।
৫. নিরাপদে সার্ভ করুন। নিজের allow-list থেকে Content-Type পাঠান, X-Content-Type-Options: nosniff দিন, আর ডকুমেন্টে Content-Disposition: attachment ব্যবহার করুন। মূল domain থেকে user-এর HTML বা SVG inline দেবেন না।
৬. আকার ও সংখ্যা সীমিত করুন। সর্বোচ্চ ফাইল আকার, ফাইলের সংখ্যা ও প্রতি user-এর request হার ঠিক করুন। ছবির মাপ ও archive-এর ফোলা সীমিত করুন।
৭. Scan করুন। শেয়ার করা ফাইলে antivirus বা malware scan চালান, আদর্শভাবে queue-তে async, ফাইল পাওয়া যাওয়ার আগে।
৮. Access যাচাই করুন। User upload করতে পারে কি না, এবং শুধু মালিক (বা অনুমোদিত user) private ফাইল পড়তে পারে কি না যাচাই করুন (IDOR দেখুন)। মেয়াদসহ signed URL ব্যবহার করুন।
৯. Least privilege। Upload সামলানো process-এর অপ্রয়োজনীয় অধিকার থাকবে না।
Presigned upload
Browser-কে ছোট মেয়াদের presigned URL (আকার ও ধরনের সীমাসহ) দিয়ে সরাসরি object storage-এ upload করতে দিলে ভারী ও ঝুঁকিপূর্ণ ফাইল সামলানো আপনার app server থেকে দূরে থাকে।
মূল কথা: ধরন allow-list করুন, আসল কনটেন্ট যাচাই করুন, ফাইলের নাম বদলান, আলাদা domain-এ কোড চলার জায়গা থেকে দূরে রাখুন, আকার সীমিত করুন এবং scan করুন।
ওয়েব সিকিউরিটি সিরিজ, পর্ব ২ (আরও bug শ্রেণি ও hardening): 3 নম্বর (মোট 6)। আগের লেখা: CORS সহজ ভাষায়: কী এবং কীভাবে ভুল কনফিগার হয়.
