PHP বাগ #২১ থেকে #৩০: সাধারণ ভুলসমূহ

PHP আপনাকে কোনো সতর্কতা ছাড়াই ভুল করার সুযোগ দেয়। কোনো কিছু ব্যর্থ হলেও এটি প্রায়শই চলতে থাকে। এর ফলে নিঃশব্দে ডেটা নষ্ট হওয়া (data corruption) বা সিকিউরিটি হোল তৈরি হতে পারে।

এখানে এড়ানোর মতো ১০টি গুরুত্বপূর্ণ বাগ দেওয়া হলো:

  • Multibyte Text strlen() বাইট গণনা করে, ক্যারেক্টার নয়। এটি হিন্দি বা ইমোজি টেক্সটকে নষ্ট করে দেয়। এর পরিবর্তে mb_strlen() ব্যবহার করুন।

  • Unvalidated API Calls file_get_contents() নিঃশব্দে ব্যর্থ হতে পারে। json_decode() null রিটার্ন করতে পারে। সবসময় চেক করুন রেসপন্সটি false কি না এবং json_last_error() যাচাই করুন।

  • Temporary Cookies এক্সপায়ারি ডেট ছাড়া setcookie() ব্যবহার করলে ব্রাউজার বন্ধ করার সাথে সাথে কুকিটি মুছে যায়। একটি এক্সপায়ারি টাইম সেট করুন এবং XSS অ্যাটাক প্রতিরোধ করতে httponly ফ্ল্যাগ ব্যবহার করুন।

  • Unsafe File Uploads শুধুমাত্র ফাইলের এক্সটেনশন চেক করা যথেষ্ট নয়। হ্যাকাররা shell.php ফাইলটির নাম পরিবর্তন করে shell.jpg করে দিতে পারে। প্রকৃত MIME টাইপ চেক করতে finfo_file() ব্যবহার করুন।

  • Math with Formatted Strings PHP কমা (comma) দেখলে সংখ্যা পড়া বন্ধ করে দেয়। ফলে "1,299.00" হয়ে যায় 1। গণনা করার আগে str_replace() দিয়ে কমা সরিয়ে ফেলুন। আপনার ডেটাবেসে র (raw) নম্বর সংরক্ষণ করুন।

  • Shared Static Properties Static properties ক্লাসের অন্তর্ভুক্ত, অবজেক্টের নয়। প্রতিটি ইনস্ট্যান্স একই ডেটা শেয়ার করে। ইউজার-নির্দিষ্ট ডেটার জন্য সাধারণ public properties ব্যবহার করুন।

  • Redirects Without Exit header("Location: ...") শুধুমাত্র ব্রাউজারকে একটি নির্দেশ পাঠায়। সার্ভার স্ক্রিপ্টটি চালানো চালিয়ে যায়। রিডাইরেক্ট করার পর সবসময় exit() কল করুন।

  • SQL Injection কোয়েরি স্ট্রিং-এ সরাসরি ভেরিয়েবল ব্যবহার করলে হ্যাকাররা আপনার ডেটাবেস নিয়ন্ত্রণ করতে পারে। PDO-এর সাথে prepared statements ব্যবহার করুন।

  • Memory Crashes file_get_contents() পুরো ফাইলটি RAM-এ লোড করে। বড় ফাইলের ক্ষেত্রে এটি আপনার সার্ভার ক্র্যাশ করতে পারে। ফাইল লাইন বাই লাইন পড়ার জন্য fopen() এবং fgets() ব্যবহার করুন।

  • Silent Database Errors ডিফল্টভাবে PDO নীরব থাকে। এররগুলো exception থ্রো করার পরিবর্তে false রিটার্ন করে। PDO::ATTR_ERRMODE কে PDO::ERRMODE_EXCEPTION হিসেবে সেট করুন।

সমাধানটি সহজ: সুনির্দিষ্ট হোন। প্রতিটি রিটার্ন ভ্যালু চেক করুন। প্রতিটি ইনপুট যাচাই করুন। কোনো ফাংশন কাজ করেছে বলে কখনোই ধরে নেবেন না।

সম্পূর্ণ নিবন্ধ: https://dev.to/bikkisingh/php-bugs-21-to-30-common-mistakes-every-php-developer-must-knowpublished-5hbp