हां, MySQL किसी भी प्रकार के टेक्स्ट को तकनीकी रूप से सुरक्षित रूप से स्टोर कर सकता है। जिसका अर्थ है, MySQL टेक्स्ट को वैसे ही सेव करेगा और बिना कोई डेटा खोए इसे फिर से लौटा देगा।
Mysql टेक्स्ट की सामग्री के बीच भिन्न नहीं है, इसलिए इससे कोई फर्क नहीं पड़ता कि यह HTML, CSS, JS कोड है या आपके मित्र अंतिम ईमेल हैं।
हालाँकि यदि आप बाद में टेक्स्ट को आउटपुट करते हैं तो आपको ध्यान रखना चाहिए कि MySQL से डेटा खींचने के बाद कोई अवांछित कोड इंजेक्शन नहीं है। लेकिन यह वास्तव में MySQL से संबंधित नहीं है।
आपको sql को अधिक सुरक्षित बनाने के लिए, डेटाबेस हैंडल को <पर पास करें। कोड>mysql_real_escape_string या इससे भी बेहतर MySQLi का उपयोग करें और/या पीडीओ और तैयार बयान।
आपका कोड
आपका कोड ऐसा लगता है कि आप किसी चीज़ को रोकने के लिए बहुत प्रयास कर रहे हैं, लेकिन अंत में यह बहुत बेकार हो जाता है:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
डेटा को संसाधित करने से पहले उसे सामान्य करें
सबसे पहले आपको get_magic_quotes_gpc
के लिए चेक की स्थिति बदलनी चाहिए उस डेटा को सामान्य करने के लिए जिस पर फ़ंक्शन काम कर रहा है। यह और भी अच्छा होगा यदि आपका आवेदन उस पर निर्भर न हो, लेकिन वह विकल्प सक्षम होने पर काम करने से इनकार कर दे - उसके बारे में यह महत्वपूर्ण जानकारी यहां देखें
अगर आप सुरक्षा की परवाह करते हैं।
लेकिन आपके पोस्ट किए गए कोड की सुरक्षा के लिए, आइए पहले फ़ंक्शन को आगे संसाधित करने से पहले इनपुट मान को सामान्य करें। यह चेक को फ़ंक्शन के शीर्ष पर ले जाकर किया जाता है।
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
इस संशोधित फ़ंक्शन में, मैजिक कोट्स स्टफ (जिसका आपको उपयोग नहीं करना चाहिए) को इसके शीर्ष पर ले जाया गया है। यह सुनिश्चित करता है कि उस विकल्प के चालू या बंद होने के बावजूद, डेटा को हमेशा उसी तरह संसाधित किया जाएगा। आपके फ़ंक्शन ने ऐसा नहीं किया, यह पास किए गए समान डेटा के लिए अलग-अलग परिणाम बनाता। तो इसे ठीक कर दिया गया है।
आपके फ़ंक्शन के साथ और समस्याएं
यहां तक कि फ़ंक्शन भी अब बेहतर दिखता है, इसमें अभी भी कई समस्याएं हैं। उदाहरण के लिए, यह स्पष्ट नहीं है कि फ़ंक्शन वास्तव में क्या करता है। यह एक साथ कई काम करता है और उनमें से कुछ विरोधाभासी हैं:
- यह HTML टैग्स को हटाता है जो एक संकेत है कि
$data
HTML शामिल नहीं होना चाहिए - लेकिन फिर आप
$data
. के टेक्स्ट को कनवर्ट करते हैं जिसमें वास्तव में HTML इकाइयां हों।
तो डेटा क्या होना चाहिए? एचटीएमएल या नहीं? यदि चीजें अस्पष्ट हो जाती हैं तो यह अधिक सुरक्षा का परिचय नहीं देता है क्योंकि इससे लाभ होगा कि आपके कार्यक्रम में त्रुटियां आती हैं और अंत में आपकी सुरक्षा सावधानियों को भी पार कर जाती हैं।
तो आपको बस कोड को फेंक देना चाहिए और निम्नलिखित पर विचार करना चाहिए:
- यदि आपके आवेदन में इनपुट अमान्य है, तो उसे फ़िल्टर न करें। इसके बजाय अमान्य इनपुट के आगे उपयोग को रोकें। इसलिए आपको इनपुट का उपयोग करने से पहले उसे सत्यापित करने के लिए एक फ़ंक्शन की आवश्यकता होती है।
- डेटा को केवल इसलिए न बदलें क्योंकि आपको लगता है यह कुछ और सुरक्षित बना सकता है। इसके बजाय जहां आवश्यक और उपयुक्त हो वहां डेटा बदलें और एन्कोड करें।
- अपने आवेदन को केवल जादुई उद्धरणों के साथ काम करने दें। इस सुविधा पर भरोसा करना बेहद हतोत्साहित करता है। और फिर आपके कोड में इसकी पूरी जांच करने की कोई आवश्यकता नहीं है।
- डेटाबेस के भीतर कुछ सुरक्षित रूप से संग्रहीत करने के लिए, केवल क्वेरी में उपयोग करने से पहले डेटा से बचें। आपके आवेदन के किसी अन्य स्थान पर नहीं। उसके लिए तैयार कथनों का प्रयोग करें।
- डेटा को वैध होने पर डेटाबेस में डालने से पहले डेटा को घुमाने की आवश्यकता नहीं है। लेकिन वेबपेज पर इसे आउटपुट करते समय आपको इसे ठीक से एन्कोड करना होगा . और केवल वहां एक एप्लिकेशन जानता है कि यह किस एन्कोडिंग में होना चाहिए। आप नहीं जानते कि जब आप डेटा को डेटाबेस में डालते हैं।
इसलिए यदि आप अपने कोड को अधिक सुरक्षित बनाना चाहते हैं, तो यह कुछ डेटा पर कार्यों का एक गुच्छा फेंकने के बारे में नहीं है क्योंकि आपको लगता है कि वे सुरक्षा से संबंधित हैं। ऐसा करने से आप अपने सॉफ़्टवेयर को अधिक सुरक्षित नहीं बल्कि कम सुरक्षित बनाते हैं।
- उपयोगकर्ता डेटा पर कभी भरोसा न करें.
- सुनिश्चित करें कि डेटा उस प्रारूप में है जिसकी आपको आवश्यकता है पूर्व प्रसंस्करण ।
- नौकरी के लिए सही जगह पर सही टूल का इस्तेमाल करें।
- अनुमान लगाकर कभी भी टूल का उपयोग न करें। इसके बजाय ज्ञान प्राप्त करें, जो न केवल सुरक्षा के लिहाज से भुगतान करता है।