ईमानदार होने के लिए, मुझे लगता है कि इन फ़ंक्शन के लेखक को या तो पता नहीं है कि XSS और SQL इंजेक्शन क्या हैं या वास्तव में उपयोग किए गए फ़ंक्शन क्या करते हैं।
केवल दो विषमताओं को नाम देने के लिए:
stripslashes
का इस्तेमाल करनाmysql_real_escape_string
के बादmysql_real_escape_string
. द्वारा जोड़े गए स्लैश को हटा देता है ।htmlentities
चैट करने वालों की जगह लेता है<
और>
जिनका उपयोगstrip_tags
में किया जाता है टैग की पहचान करने के लिए।
इसके अलावा:सामान्य तौर पर, एक्सएसएस की रक्षा करने वाले कार्य फिर से एसक्यूएल इंजेक्शन और इसके विपरीत की रक्षा के लिए उपयुक्त नहीं हैं। क्योंकि प्रत्येक भाषा और संदर्भ के अपने विशेष वर्ण होते हैं जिनका ध्यान रखने की आवश्यकता होती है।
मेरी सलाह है कि यह जानें कि कोड इंजेक्शन क्यों और कैसे संभव है और इससे कैसे बचाव किया जाए। जानें कि आप जिन भाषाओं के साथ काम कर रहे हैं, विशेष रूप से विशेष पात्र और उनसे कैसे बचें।
संपादित करें यहां कुछ (शायद अजीब) उदाहरण दिया गया है:कल्पना करें कि आप अपने उपयोगकर्ताओं को कुछ मूल्य इनपुट करने की अनुमति देते हैं जिसे यूआरआई में पथ खंड के रूप में उपयोग किया जाना चाहिए जिसका उपयोग आप onclick
में कुछ जावास्क्रिप्ट कोड में करते हैं। मान बताइए। तो भाषा का संदर्भ इस तरह दिखता है:
- HTML विशेषता मान
- जावास्क्रिप्ट स्ट्रिंग
- यूआरआई पथ खंड
- जावास्क्रिप्ट स्ट्रिंग
और इसे और मज़ेदार बनाने के लिए:आप इस इनपुट मान को डेटाबेस में संग्रहीत कर रहे हैं।
अब इस इनपुट मान को अपने डेटाबेस में सही ढंग से संग्रहीत करने के लिए, आपको बस उस संदर्भ के लिए एक उचित एन्कोडिंग का उपयोग करने की आवश्यकता है जिसे आप अपनी डेटाबेस भाषा (यानी SQL) में सम्मिलित करने वाले हैं; बाकी कोई फर्क नहीं पड़ता (अभी तक)। चूंकि आप इसे SQL स्ट्रिंग घोषणा में सम्मिलित करना चाहते हैं, प्रासंगिक विशेष वर्ण वे वर्ण हैं जो आपको उस संदर्भ को बदलने की अनुमति देते हैं। स्ट्रिंग घोषणाओं के लिए ये वर्ण (विशेषकर) "
. हैं , '
, और \
पात्रों से बचने की जरूरत है। लेकिन जैसा कि पहले ही कहा जा चुका है, तैयार कथन आपके लिए वह सब काम करते हैं, इसलिए उनका उपयोग करें।
अब जब आपके डेटाबेस में मूल्य है, तो हम उन्हें ठीक से आउटपुट करना चाहते हैं। यहां हम अंतरतम से सबसे बाहरी संदर्भ में आगे बढ़ते हैं और प्रत्येक संदर्भ में उचित एन्कोडिंग लागू करते हैं:
- URI पथ खंड के लिए संदर्भ हमें उन सभी पात्रों (कम से कम) से बचने की जरूरत है जो हमें उस संदर्भ को बदलने दें; इस मामले में
/
(वर्तमान पथ खंड छोड़ें),?
, और#
(दोनों यूआरआई पथ संदर्भ छोड़ते हैं)। हमrawurlencode
का इस्तेमाल कर सकते हैं इसके लिए। - जावास्क्रिप्ट स्ट्रिंग के लिए संदर्भ हमें
"
. का ध्यान रखने की आवश्यकता है ,'
, और\
. हमjson_encode
का इस्तेमाल कर सकते हैं इसके लिए (यदि उपलब्ध हो)। - HTML विशेषता मान के लिए हमें
&
का ध्यान रखना होगा ,"
,'
, और<
. हमhtmlspecialchars
का उपयोग कर सकते हैं इसके लिए।
अब सब कुछ एक साथ:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
अब अगर $row['user-input']
"bar/baz"
. है आउटपुट है:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
लेकिन इन संदर्भों में इन सभी कार्यों का उपयोग करना कोई अतिश्योक्ति नहीं है। क्योंकि हालांकि संदर्भों में समान विशेष वर्ण हो सकते हैं, उनके पास अलग-अलग भागने के क्रम हैं। यूआरआई में तथाकथित प्रतिशत एन्कोडिंग है, जावास्क्रिप्ट में एस्केप सीक्वेंस हैं जैसे \"
और HTML में वर्ण संदर्भ हैं जैसे "
. और इनमें से केवल एक फ़ंक्शन का उपयोग न करने से संदर्भ टूट जाएगा।