PHP फॉर्म सत्यापन
यह और अगले अध्याय दिखाते हैं कि फॉर्म डेटा को मान्य करने के लिए PHP का उपयोग कैसे करें।
PHP फॉर्म सत्यापन
PHP रूपों को संसाधित करते समय सुरक्षा के बारे में सोचें!
ये पृष्ठ दिखाएंगे कि सुरक्षा को ध्यान में रखते हुए PHP प्रपत्रों को कैसे संसाधित किया जाए। आपके फ़ॉर्म को हैकर्स और स्पैमर से बचाने के लिए फ़ॉर्म डेटा का उचित सत्यापन महत्वपूर्ण है!
इन अध्यायों में हम जिस HTML फॉर्म पर काम करेंगे, उसमें विभिन्न इनपुट फ़ील्ड शामिल हैं: आवश्यक और वैकल्पिक टेक्स्ट फ़ील्ड, रेडियो बटन और सबमिट बटन:
ऊपर दिए गए फॉर्म के सत्यापन नियम इस प्रकार हैं:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
सबसे पहले हम फॉर्म के लिए सादे HTML कोड को देखेंगे:
टेक्स्ट फ़ील्ड
नाम, ईमेल और वेबसाइट फ़ील्ड टेक्स्ट इनपुट तत्व हैं, और टिप्पणी फ़ील्ड एक टेक्स्ट क्षेत्र है। एचटीएमएल कोड इस तरह दिखता है:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
रेडियो के बटन
लिंग फ़ील्ड रेडियो बटन हैं और HTML कोड इस तरह दिखता है:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
प्रपत्र तत्व
फॉर्म का एचटीएमएल कोड इस तरह दिखता है:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
जब फॉर्म जमा किया जाता है, तो फॉर्म डेटा विधि = "पोस्ट" के साथ भेजा जाता है।
$_SERVER["PHP_SELF"] चर क्या है?
$_SERVER["PHP_SELF"] एक सुपर ग्लोबल वैरिएबल है जो वर्तमान में निष्पादित स्क्रिप्ट का फ़ाइल नाम देता है।
इसलिए, $_SERVER["PHP_SELF"] सबमिट किए गए प्रपत्र डेटा को किसी भिन्न पृष्ठ पर जाने के बजाय, पृष्ठ पर ही भेजता है। इस तरह, उपयोगकर्ता को फॉर्म के समान पृष्ठ पर त्रुटि संदेश प्राप्त होंगे।
htmlspecialchars() फ़ंक्शन क्या है?
htmlspecialchars() फ़ंक्शन विशेष वर्णों को HTML निकायों में परिवर्तित करता है। इसका अर्थ है कि यह HTML वर्णों जैसे < और > को < और >. यह हमलावरों को फॉर्म में HTML या Javascript कोड (क्रॉस-साइट स्क्रिप्टिंग अटैक) इंजेक्ट करके कोड का फायदा उठाने से रोकता है।
PHP फॉर्म सुरक्षा पर बड़ा नोट
$_SERVER["PHP_SELF"] वैरिएबल का उपयोग हैकर्स कर सकते हैं!
यदि आपके पृष्ठ में PHP_SELF का उपयोग किया जाता है तो उपयोगकर्ता एक स्लैश (/) दर्ज कर सकता है और फिर कुछ क्रॉस साइट स्क्रिप्टिंग (XSS) कमांड निष्पादित करने के लिए दर्ज कर सकता है।
क्रॉस-साइट स्क्रिप्टिंग (XSS) एक प्रकार की कंप्यूटर सुरक्षा भेद्यता है जो आमतौर पर वेब अनुप्रयोगों में पाई जाती है। XSS हमलावरों को क्लाइंट-साइड स्क्रिप्ट को अन्य उपयोगकर्ताओं द्वारा देखे गए वेब पेजों में इंजेक्ट करने में सक्षम बनाता है।
मान लें कि हमारे पास "test_form.php" नामक पृष्ठ में निम्न रूप है:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
अब, यदि कोई उपयोगकर्ता "http://www.example.com/test_form.php" जैसे एड्रेस बार में सामान्य URL दर्ज करता है, तो उपरोक्त कोड का अनुवाद किया जाएगा:
<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>
यह कोड एक स्क्रिप्ट टैग और एक अलर्ट कमांड जोड़ता है। और जब पृष्ठ लोड होता है, तो जावास्क्रिप्ट कोड निष्पादित किया जाएगा (उपयोगकर्ता को एक अलर्ट बॉक्स दिखाई देगा)। यह सिर्फ एक सरल और हानिरहित उदाहरण है कि कैसे PHP_SELF चर का शोषण किया जा सकता है।
इस बात से अवगत रहें कि किसी भी JavaScript कोड को <script> टैग के अंदर जोड़ा जा सकता है! एक हैकर उपयोगकर्ता को किसी अन्य सर्वर पर फ़ाइल पर रीडायरेक्ट कर सकता है, और वह फ़ाइल दुर्भावनापूर्ण कोड धारण कर सकती है जो वैश्विक चर को बदल सकती है या उपयोगकर्ता डेटा को सहेजने के लिए फ़ॉर्म को किसी अन्य पते पर सबमिट कर सकती है, उदाहरण के लिए।
$_SERVER["PHP_SELF"] शोषण से कैसे बचें?
$_SERVER["PHP_SELF"] htmlspecialchars() फ़ंक्शन का उपयोग करके शोषण से बचा जा सकता है।
फॉर्म कोड इस तरह दिखना चाहिए:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() फ़ंक्शन विशेष वर्णों को HTML निकायों में परिवर्तित करता है। अब यदि उपयोगकर्ता PHP_SELF चर का शोषण करने का प्रयास करता है, तो इसका परिणाम निम्न आउटपुट में होगा:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
शोषण का प्रयास विफल रहता है, और कोई नुकसान नहीं होता है!
PHP के साथ फॉर्म डेटा मान्य करें
पहली चीज जो हम करेंगे वह है PHP के htmlspecialchars() फ़ंक्शन के माध्यम से सभी वेरिएबल्स को पास करना।
जब हम htmlspecialchars() फ़ंक्शन का उपयोग करते हैं; फिर यदि कोई उपयोगकर्ता टेक्स्ट फ़ील्ड में निम्नलिखित सबमिट करने का प्रयास करता है:
<script>location.href('http://www.hacked.com')</script>
- इसे निष्पादित नहीं किया जाएगा, क्योंकि इसे HTML एस्केप कोड के रूप में सहेजा जाएगा, जैसे:
<script>location.href('http://www.hacked.com')</script>
कोड अब पेज पर या ई-मेल के अंदर प्रदर्शित होने के लिए सुरक्षित है।
जब उपयोगकर्ता फ़ॉर्म सबमिट करेगा तो हम दो और काम भी करेंगे:
- उपयोगकर्ता इनपुट डेटा (PHP ट्रिम () फ़ंक्शन के साथ) से अनावश्यक वर्णों (अतिरिक्त स्थान, टैब, न्यूलाइन) को हटा दें।
- उपयोगकर्ता इनपुट डेटा से बैकस्लैश (\) निकालें (PHP स्ट्रिप्सलाश () फ़ंक्शन के साथ)
अगला कदम एक ऐसा फ़ंक्शन बनाना है जो हमारे लिए सभी जांच करेगा (जो एक ही कोड को बार-बार लिखने से कहीं अधिक सुविधाजनक है)।
हम फ़ंक्शन का नाम test_input() रखेंगे।
अब, हम प्रत्येक $_POST चर को test_input() फ़ंक्शन के साथ जांच सकते हैं, और स्क्रिप्ट इस तरह दिखती है:
उदाहरण
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
ध्यान दें कि स्क्रिप्ट की शुरुआत में, हम जांचते हैं कि फॉर्म $_SERVER["REQUEST_METHOD"] का उपयोग करके सबमिट किया गया है या नहीं। यदि REQUEST_METHOD पोस्ट है, तो फॉर्म जमा कर दिया गया है - और इसे मान्य किया जाना चाहिए। यदि इसे सबमिट नहीं किया गया है, तो सत्यापन को छोड़ दें और एक खाली फॉर्म प्रदर्शित करें।
हालांकि, ऊपर के उदाहरण में, सभी इनपुट फ़ील्ड वैकल्पिक हैं। यदि उपयोगकर्ता कोई डेटा दर्ज नहीं करता है तो भी स्क्रिप्ट ठीक काम करती है।
अगला कदम इनपुट फ़ील्ड को आवश्यक बनाना और यदि आवश्यक हो तो त्रुटि संदेश बनाना है।