যখন এটি ডাটাবেস প্রশ্নের ক্ষেত্রে আসে, সর্বদা চেষ্টা করুন এবং প্রস্তুত প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করুন। mysqli
এবং PDO
লাইব্রেরি এই সমর্থন করি। এটি যেমন পালিয়ে যাওয়া ফাংশনগুলি ব্যবহার করার চেয়ে সীমাহীন সুরক্ষিত mysql_real_escape_string
।
হ্যাঁ, mysql_real_escape_string
কার্যকরভাবে একটি স্ট্রিং পলায়ন ফাংশন। এটি কোনও ম্যাজিক বুলেট নয়। এটি কেবলমাত্র বিপজ্জনক চরিত্রগুলি এড়ানোর জন্য যাতে তারা একটি একক ক্যোয়ারী স্ট্রিংয়ে নিরাপদ থাকতে পারে। তবে, আপনি যদি আগে থেকে নিজের ইনপুটগুলি স্যানিটাইজ না করেন তবে আপনি নির্দিষ্ট আক্রমণকারী ভেক্টরদের কাছে ঝুঁকির মধ্যে পড়বেন।
নিম্নলিখিত এসকিউএল কল্পনা করুন:
$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);
আপনার এটি দেখতে সক্ষম হওয়া উচিত যে এটি শোষণের পক্ষে ঝুঁকিপূর্ণ।
কল্পনা করুন যে id
প্যারামিটারটিতে সাধারণ আক্রমণ ভেক্টর রয়েছে:
1 OR 1=1
এনকোড করার জন্য সেখানে কোনও ঝুঁকিপূর্ণ অক্ষর নেই, সুতরাং এটি সরাসরি পালানো ফিল্টারটির মধ্য দিয়ে চলে যাবে। আমাদের ছেড়ে:
SELECT fields FROM table WHERE id= 1 OR 1=1
যা একটি সুন্দর এসকিউএল ইঞ্জেকশন ভেক্টর এবং আক্রমণকারীকে সমস্ত সারি ফেরত দিতে দেয়। অথবা
1 or is_admin=1 order by id limit 1
যা উত্পাদন করে
SELECT fields FROM table WHERE id=1 or is_admin=1 order by id limit 1
যা আক্রমণকারীটিকে এই সম্পূর্ণ কাল্পনিক উদাহরণে প্রথম প্রশাসকের বিশদ ফিরিয়ে দিতে দেয়।
যদিও এই ফাংশনগুলি কার্যকর, সেগুলি অবশ্যই যত্ন সহ ব্যবহার করা উচিত। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সমস্ত ওয়েব ইনপুটগুলি কিছুটা ডিগ্রীতে বৈধ হয়েছে। এই ক্ষেত্রে, আমরা দেখতে পাচ্ছি যে আমাদের শোষণ করা যেতে পারে কারণ আমরা পরীক্ষা করে দেখিনি যে আমরা একটি চলকটি সংখ্যা হিসাবে ব্যবহার করছিলাম, এটি আসলে সংখ্যাসূচক ছিল। পিএইচপি-তে আপনার ইনপুটগুলি পূর্ণসংখ্যার, ভাসমান, আলফানিউমারিক ইত্যাদি রয়েছে কিনা তা পরীক্ষা করতে বিস্তৃত ফাংশনগুলির একটি সেট ব্যবহার করা উচিত তবে এসকিউএল এর ক্ষেত্রে, প্রস্তুত বিবৃতিটির সর্বাধিক মানটি মনোযোগ দেওয়া উচিত। উপরের কোডটি সুরক্ষিত থাকত যদি এটি প্রস্তুত বিবৃতি হত কারণ ডাটাবেস ফাংশনগুলি জানত যে 1 OR 1=1
এটি বৈধ আক্ষরিক নয়।
হিসাবে হিসাবে htmlspecialchars()
। এটি নিজস্ব একটি খনি ক্ষেত্র।
পিএইচপি-তে একটি আসল সমস্যা রয়েছে যে এতে বিভিন্ন HTML- সম্পর্কিত পালিয়ে যাওয়া ফাংশনগুলির পুরো নির্বাচন রয়েছে এবং ঠিক কোন ফাংশনগুলি কী করে সে সম্পর্কে কোনও পরিষ্কার নির্দেশিকা নেই।
প্রথমত, আপনি যদি এইচটিএমএল ট্যাগের ভিতরে থাকেন তবে আপনি প্রকৃত সমস্যায় পড়েছেন। তাকানো
echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';
আমরা ইতিমধ্যে একটি HTML ট্যাগের ভিতরে রয়েছি, তাই বিপজ্জনক কিছু করার জন্য আমাদের <বা> দরকার নেই। আমাদের আক্রমণ ভেক্টর ঠিক হতে পারেjavascript:alert(document.cookie)
এখন ফলাফল HTML এর মত দেখাচ্ছে
<img src= "javascript:alert(document.cookie)" />
আক্রমণ সরাসরি হয়ে যায়।
এটা খুব খারাপ হচ্ছে. কেন? কারণ htmlspecialchars
(যখন এটি বলা হয়) কেবল ডাবল উদ্ধৃতিগুলি এনকোড করে এবং একক নয়। সুতরাং আমরা যদি
echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";
আমাদের অশুভ আক্রমণকারী সম্পূর্ণ নতুন পরামিতি ইনজেক্ট করতে পারে
pic.png' onclick='location.href=xxx' onmouseover='...
আমাদের দেয়
<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />
এই ক্ষেত্রে, কোনও ম্যাজিক বুলেট নেই, আপনাকে কেবল নিজেই ইনপুটটি সন্তুষ্ট করতে হবে। আপনি যদি খারাপ চরিত্রগুলি চেষ্টা করে এবং ফিল্টার করেন তবে অবশ্যই ব্যর্থ হবেন। একটি শ্বেত তালিকাটি গ্রহণ করুন এবং কেবল ভাল বর্ণগুলি দিয়ে দিন। এ পদ্ধতি এটা XSS ঠকাই শীট কিভাবে বিচিত্র ভেক্টর হতে পারে উপর উদাহরণের জন্য
এমনকি আপনি যদি htmlspecialchars($string)
এইচটিএমএল ট্যাগগুলির বাইরে ব্যবহার করেন তবে আপনি এখনও মাল্টি-বাইট চারসেট আক্রমণ আক্রমণকারীদের কাছে ঝুঁকির মধ্যে রয়েছেন।
আপনি সবচেয়ে কার্যকর হতে পারেন নিম্নোক্তভাবে mb_convert_encoding এবং htmlentities এর সংমিশ্রণটি ব্যবহার করা।
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
এমনকি এটি আইটি 6 কে দুর্বল করে দেয়, কারণ এটি ইউটিএফ পরিচালনা করে of তবে আইআই 6 এর ব্যবহার বন্ধ না হওয়া পর্যন্ত আপনি আইএসও -8859-1 এর মতো আরও সীমিত এনকোডিংয়ে ফিরে যেতে পারেন।
মাল্টিবাইট সমস্যার আরও গভীরতার সাথে অধ্যয়নের জন্য https://stackoverflow.com/a/12118602/1820 দেখুন