পিএইচপি ফর্ম ভ্যালিডেশন
এই অধ্যায় এবং পরবর্তী অধ্যায়ে আমরা পিএইচপি ফর্ম ভ্যালিডেশন(validation) নিয়ে আলোচনা করবো।
পিএইচপি ফর্ম ভ্যালিডেশন
আমরা কেন ফর্ম এর বৈধতা বা ভ্যালিডিটি যাচাই করি? সিকিউরিটির কথা মাথায় রেখেই আমরা মূলত পিএইচপি ফর্ম এর ভ্যালিডিটি যাচাই করি।
সিকিউরিটিকে প্রাধান্য দিয়ে কিভাবে ফর্ম ভ্যালিড করতে হয় এই অধ্যায়ে আমরা স্টেপ বাই স্টেপ দেখবো। হ্যাকার বা স্প্যামার থেকে ফর্মকে রক্ষা করার জন্য উপযুক্ত ফর্ম ভ্যালিডেশন আবশ্যক!
আমরা যে এইচটিএমএল ফর্ম নিয়ে কাজ করবো তার মধ্যে বিভিন্ন ইনপুট ফিল্ড রয়েছেঃ আবশ্যক এবং ঐচ্ছিক টেক্সট ফিল্ড, রেডিও বাটন এবং সাবমিট বাটন।
উপরের ফর্মটি ভ্যালিডেশন করার রুলসগুলো নিম্নরুপঃ
ফিল্ড | ভ্যালিডেশন রুলস |
---|---|
নাম | আবশ্যক। এবং এতে শুধুমাত্র লেটার(letter) এবং whitespace থাকবে। |
ই-মেইল | আবশ্যক। একটি ভ্যালিড ইমেইল হতে হবে (@ এবং . সহ)। |
লিঙ্গ | আবশ্যক। কমপক্ষে একটি ফিল্ড অবশ্যই সিলেক্ট করতে হবে। |
মেসেজ | ঐচ্ছিক। মাল্টি-লাইন ইনপুট ফিল্ড(টেক্সট-এরিয়া)। |
সর্বপ্রথম, আমরা ফর্ম থেকে প্লেইন এইচটিএমএল কোডগুলো লক্ষ্য করবোঃ
টেক্সট ফিল্ড
নাম এবং ই-মেইল হলো টেক্সট ইনপুট এলিমেন্ট এবং মেসেজ হলো টেক্সট-এরিয়া। এই তিনটি ইনপুট ফিল্ডের সমন্বয়ে গঠিত এইচটিএমএল কোডগুলো দেখতে এমনঃ
নামঃ <input type="text" name="name">
ই-মেইলঃ <input type="text" name="email">
মেসেজঃ <textarea name="messege" rows="5" cols="40"></textarea>
রেডিও(Radio) বাটন
লিঙ্গ নির্ধারণ করার ফিল্ডটি হলো রেডিও বাটন এবং এইচটিএমএল কোডগুলো দেখতে এমনঃ
লিঙ্গঃ <input type="radio" name="gender" value="male">পূরুষ
<input type="radio" name="gender" value="female">মহিলা
ফর্ম এলিমেন্ট
ফর্ম এলিমেন্ট দেখতে এমনঃ
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<!--এইচটিএমএল ইনপুট ফিল্ড -->
</form>
যখন ফর্মটি সাবমিট করা হবে, ফর্মের ডাটাগুলো method="post" এর মাধ্যমে পাঠানো হবেঃ
$_SERVER["PHP_SELF"]
ভ্যারিয়েবল কি?$_SERVER["PHP_SELF"]
একটি সুপারগ্লোবাল ভ্যারিয়েবল যা বর্তমানে সম্পাদিত স্ক্রিপ্ট এর নাম রিটার্ন করে। সুতরাং ফর্ম ডেটাকে প্রসেস করার জন্য অন্য পেজে না পাঠিয়ে একই(ফর্মটি যে পেজ থাকে) পেজ থেকে প্রসেস করতে হলে এই ভ্যারিয়েবলটি ব্যবহার করতে হয়।
htmlspecialchars()
ফাংশন কি?
htmlspecialchars()
ফাংশনটি বিশেষ বিশেষ ক্যারেক্টারসমূহকে এইচটিএমএল এনটিটি(entity) তে রূপান্তর করে। সুতরাং এটি এইচটিএমএল ক্যারেক্টার যেমন- < এবং > কে যথাক্রমে < এবং > দিয়ে রিপ্লেস করে। এটি হ্যাকার কর্তৃক এইচটিএমএল এবং জাভাস্ক্রিপ্ট কোডের ইনজেকশন (Cross-site Scripting attacks) দ্বারা ফর্ম কোডকে ধ্বংশের হাত থেকে রক্ষা করে।
পিএইচপি ফর্ম সিকিউরিটি
$_SERVER["PHP_SELF"]
ভ্যারিয়েবলটি হ্যাকার কর্তৃক ব্যবহৃত হতে পারে!
আপনি যদি আপনার ওয়েব পেজে PHP_SELF ব্যবহার করে থাকেন তাহলে একজন ইউজার আপনার পেজ লিঙ্কের শেষে একটি স্ল্যাশ(/) এবং এরপরে কিছু Cross Site Scripting(XSS) কমান্ড সম্পাদন করতে পারে।
কম্পিউটারের একটি দুর্বল সিকিউরিটি হচ্ছে Cross-site scripting(XSS) যা সাধারনত ওয়েব অ্যাপ্লিকেশন এর ক্ষেত্রে দেখা যায়। Cross Site Scripting(XSS) ব্যবহার করে হ্যাকাররা একটি ওয়েব পেজের client-side script ইনজেক্ট করতে সক্ষম হয়।
ধরুন, নিচের ফর্মটি "test_form.php" পেজ রয়েছেঃ
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
এখন যদি একজন ইউজার তার ব্রাউজারের ঠিকানা অংশে সাধারন URL প্রবেশ করায় যেমনঃ "http://www.example.com/test_form.php" তাহলে উপরের কোড নিম্নের কোডে রূপান্তরিত হবেঃ
<form method="post" action="test_form.php">
এখন পর্যন্ত সবই ঠিক আছে।
যাইহোক, ধরুন একজন ইউজার নিম্নের URL টি তার ব্রাউজারের ঠিকানা অংশে প্রবেশ করালোঃ
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
এই অবস্থায় উপরের কোড টুকু নিম্নের কোডে রূপান্তরিত হবেঃ
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
এই কোডটি এলার্ট কমান্ড যুক্ত একটি script ট্যাগ যোগ করবে। আর যখন পেজটি সম্পূর্ণ লোড হবে তখন জাভাস্ক্রিপ্ট কোডটি সম্পাদিত হবে এবং ইউজার একটি সতর্ক বার্তা পাবে। এটি একটি অতি সাধারন এবং ক্ষতি বিহীন উদাহরণ যা আপনাকে বুঝতে সাহায্য করবে কিভাবে PHP_SELF ভ্যারিয়েবলটির অপব্যবহার করা যায়।
সুতরাং সর্বদা সচেতন থাকতে হবে কারন <script> ট্যাগের মধ্যে যে কোনো জাভাস্ক্রিপ্ট কোড লেখা যেতে পারে! উদাহরণ স্বরূপ, একজন হ্যাকার এটি ব্যবহার করে একজন ইউজারকে অন্য সার্ভারে রিডাইরেক্ট করে দিতে পারে এবং ঐ ফাইলটিতে ক্ষতিকারক কোড থাকতে পারে যা গ্লোবাল ভ্যারিয়েবলকে পরিবর্তন করে ফর্মের তথ্য গুলোকে অন্য ঠিকানায় জমা করতে পারে।
কিভাবে $_SERVER["PHP_SELF"] কে নিরাপদ করবেন?
$_SERVER["PHP_SELF"]
কে নিরাপদ করার জন্য htmlspecialchars()
ফাংশনটি ব্যবহার করুন।
ফর্ম কোড নিম্নের মত দেখাবেঃ
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars()
ফাংশনটি বিশেষ ক্যারেকটারসমূহকে এইচটিএমএল এন্টিটিতে রূপান্তর করে। এখন যদি কোনো হ্যাকার PHP_SELF ভ্যারিয়েবলের অপব্যবহার করতে চায়, তাহলে তা নিম্নের মত ফলাফল দেখাবেঃ
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
অপব্যবহারের প্রক্রিয়া ব্যার্থ হয়েছে এবং কোন ক্ষতি সম্পন্ন হয়নি!
পিএইচপি দ্বারা ফর্মের তথ্য যাচাই
প্রথমত, আমরা সকল ভ্যারিয়েবল এর ইনডেক্স ভ্যালু গুলোকে পিএইচপি htmlspecialchars()
ফাংশনের মধ্যে দিয়ে অতিক্রম করাবো।
যখন আমরা htmlspecialchars()
ফাংশনটি ব্যবহার করবো, তখন যদি একজন ইউজার(হ্যাকার) নিম্নের কোড গুলো ফর্মের একটি টেক্স ফিল্ডে লিখে সাবমিট করার চেস্টা করেঃ
<script>location.href('http://www.hacked.com')</script>
- তাহলে কোড সম্পাদিত(execution) হবে না, কারন এটি সংশ্লিষট ভ্যারিয়েবলে নিম্নের মত এইচটিএমএল এনটিটি কোড আকারে জমা হয়ঃ
<script>location.href('http://www.hacked.com')</script>
এখন এই কোড একটি পেইজ বা একটি ই-মেইলের মধ্যে নিরাপদের সাথে প্রর্দশিত হবে।
ইউজার কর্তৃক ফর্ম সাবমিট করার সময় অধিক নিরাপত্তার জন্য আমরা আরো দুটি কাজ করতে পারিঃ
- পিএইচপি
trim()
ফাংশনের মাধ্যমে আমরা ইউজার কর্তৃক ইনপুটকৃত তথ্য থেকে অপ্রয়োজনীয় ক্যারেক্টারসমূহ বাদ দিতে পারি। যেমন- extra space, tab, newline ইত্যাদি। - পিএইচপি
stripslashes()
ফাংশনের মাধ্যমে আমরা ইউজার ইনপুটকৃত তথ্য থেকে ব্যাকস্ল্যাশ(\) গুলোকে সরিয়ে ফেলতে পারি।
পরবর্তী ধাপে আমরা এই ফাংশনগুলোর সমন্বয়ে একটি একক ফাংশন তৈরি করে নিব যার মাধ্যমে আমরা ফর্ম সম্পর্কিত সকল ধরনের যাচাই-বাছাই এক ফাংশন থেকেই করতে পারবো। এটি আমাদের কাজ অনেকটা সহজ করে দিবে এবং একই কোড আর বার বার লিখতে হবে না।
আমরা ফাংশনটির নাম verify_input()
দিলাম।
এখন আমরা প্রতিটি _POST
ভ্যারিয়েবলকে verify_input()
ফাংশন এর মাধ্যমে পরীক্ষা করবো এবং এই কোড নিম্নের ন্যায় দেখাবেঃ
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
// খালি মান সহ ভ্যারিয়েবল গুলো ডিফাইন করি
$name = $email = $gender = $messege = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = verify_input($_POST["name"]);
$email = verify_input($_POST["email"]);
if (isset($_POST["gender"])) {
$gender = verify_input($_POST["gender"]);
}
$messege = verify_input($_POST["messege"]);
}
// ফর্ম এর তথ্য যাচাই
function verify_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>পিএইচপি ফর্ম ভ্যালিডেশন উদাহরণ</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
নামঃ <input type="text" name="name">
<br><br>
ই-মেইলঃ <input type="text" name="email">
<br><br>
লিঙ্গঃ <input type="radio" name="gender" value="male">পুরুষ
<input type="radio" name="gender" value="female">মহিলা
<br><br>
মেসেজঃ <textarea name="messege" rows="5" cols="40"></textarea>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>আপনার ইনপুটকৃত তথ্যঃ</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $gender;
echo "<br>";
echo $messege;
?>
</body>
</html>
উপরের প্রোগ্রামে লক্ষ্য করলে দেখবেন, আমরা প্রোগ্রাম এর শুরুতেই ফর্মটি $_SERVER["REQUEST_METHOD"]
ব্যবহার করে সাবমিট হবে কিনা যাচাই করে নিয়েছি।
যদি REQUEST_METHOD
টি POST
হয় কেবল তখনই ফর্মটি সাবমিট হবে এবং verify_input()
ফাংশনটি সাবমিটেড তথ্যসমূহ যাচাই করবে। আর যদি ফর্মটি সাবমিট না হয় সেক্ষেত্রে যাচাইয়ের পর্বটি এড়িয়ে যায় এবং একটি খালি ফর্ম প্রদর্শিত হবে।
উপরের উদাহরণের সকল ইনপুট ফিল্ড ঐচ্ছিক হওয়ায় ইউজার সকল ইনপুট ফিল্ডে কোন ডেটা ইনপুট না করলেও স্ক্রিপ্টটি সঠিকভাবে কাজ করবে।
পরবর্তী ধাপে আমরা ইনপুট ফিল্ড গুলোকে আবশ্যিক করবো এবং প্রয়োজন অনুসারে এরর মেসেজ তৈরি করবো।