PHP वेब अनुप्रयोग में जावास्क्रिप्ट इंजेक्शन को रोकने या रोकने के लिए आवश्यक उपाय क्या हैं ताकि संवेदनशील जानकारी नहीं दी जा सके (PHP, HTML/XHTML और जावास्क्रिप्ट में सर्वोत्तम प्रथाएं)?एक PHP वेब अनुप्रयोग में जावास्क्रिप्ट इंजेक्शन को रोकना
उत्तर
एक अच्छा पहला कदम question Gert G linked में सूचीबद्ध विधियों को लागू कर रहा है। यह काम करता है, mysql_real_escape_string
, htmlentities()
, htmlspecialchars()
, strip_tags()
और addslashes()
एक बेहतर तरीका सहित कि विभिन्न स्थितियों में इस्तेमाल किया जा सकता इनपुट को साफ करने की विविधता विस्तार से शामिल किया गया है, जब भी संभव हो, उपयोगकर्ता इनपुट अपने डेटाबेस में सीधे डालने से बचना है । whitelist input validation नियोजित करें: किसी भी परिस्थिति में जहां आपके पास केवल सीमित सीमाएं हैं, किसी भी क्लाइंट-साइड फेस फॉर्म से इनपुट लेने के बजाय, सम्मिलन के लिए हार्ड-कोड किए गए मानों में से चुनें। असल में, इसका मतलब है कि बुराई/खराब गठित/दुर्भावनापूर्ण इनपुट को खत्म/काउंटर करने का प्रयास करने के बजाय, केवल कुछ मान जो आप स्वीकार करते हैं।
उदाहरण के लिए: यदि आपके पास आइटम के लिए ड्रॉप डाउन वाला कोई फॉर्म है, तो प्रविष्टि के लिए इस ड्रॉपडाउन से इनपुट का उपयोग न करें। याद रखें कि एक दुर्भावनापूर्ण ग्राहक फ़ॉर्म के सबमिशन के साथ भेजी गई जानकारी को संपादित कर सकता है, भले ही आपको लगता है कि उनके पास केवल सीमित विकल्प हैं। इसके बजाय, ड्रॉप-डाउन को अपने सर्वर-साइड कोड में किसी सरणी में किसी इंडेक्स का संदर्भ लें। फिर डालने के लिए चुनने के लिए उस सरणी का उपयोग करें। इस तरह, भले ही कोई हमलावर आपको दुर्भावनापूर्ण कोड भेजने का प्रयास करता है, फिर भी यह वास्तव में आपके डेटाबेस को हिट नहीं करता है।
जाहिर है, यह फ़ोरम या ब्लॉग जैसे निःशुल्क फॉर्म एप्लिकेशन के लिए काम नहीं करता है। उन लोगों के लिए, आपको "पहली चरण" तकनीकों पर वापस आना होगा। फिर भी, विकल्पों की एक विस्तृत श्रृंखला है जिसे श्वेतसूची इनपुट सत्यापन के माध्यम से बेहतर किया जा सकता है।
आप जहां भी संभव हो अपने एसक्यूएल इंटरैक्शन के लिए parameterized queries (बाइंड चर के साथ उर्फ तैयार बयान) का उपयोग कर सकते हैं। यह आपके डेटाबेस सर्वर को बताएगा कि सभी इनपुट केवल एक मान है, इसलिए यह इंजेक्शन हमलों से कई संभावित समस्याओं को कम करता है। कई स्थितियों में, यह निःशुल्क फॉर्म एप्लिकेशन भी कवर कर सकता है।
यदि आपके पास नहीं कर रहा कुछ भी एचटीएमएल के रूप में स्वरूपित किए जाने की जरूरत है कि तब का उपयोग करें:
strip_tags() <- Eliminates any suspicious html
और फिर db
mysql_real_escape_string()
को सहेजने से पहले साफ करने के लिए निम्नलिखित चलाने के लिए अपनी ajax बचत है, तो उपयोगकर्ता ने टेक्स्टबॉक्स या wysiwyg के माध्यम से एचटीएमएल दर्ज किया है तो जावास्क्रिप्ट को बाहर निकालने के लिए HTMLPurifier का उपयोग करके देखें लेकिन एचटीएमएल टैग की अनुमति दें।
मेरी सीएसवी फ़ाइल में मान लीजिए मेरे पास कॉलम है जिसमें मैंने तो मैं इस कॉलम मान को कैसे हटा सकता हूं और इसे शून्य बना सकता हूं –
htmlspecialchars()डिफ़ॉल्ट द्वारा HTML पर आउटपुट के किसी भी मान का इलाज करें।
htmlspecialchars() का उपयोग न करने के लिए केवल बहाना है जब आपको HTML स्ट्रिंग में आउटपुट करने की आवश्यकता होती है जिसमें स्वयं HTML शामिल होता है। उस स्थिति में आपको यह सुनिश्चित करना होगा कि यह स्ट्रिंग पूरी तरह से सुरक्षित स्रोत से है। यदि आपके पास ऐसा आत्मविश्वास नहीं है तो आपको इसे श्वेतसूची HTML फ़िल्टर के माध्यम से पारित करना होगा जो टैग, विशेषताओं और विशेषता मानों के सावधानीपूर्वक सीमित सेट के लिए अनुमति देता है। आपको विशेषता मूल्यों के बारे में विशेष रूप से सावधान रहना चाहिए। आपको विशेषता मूल्य के रूप में विशेष रूप से स्रोत, हेफ़, शैली जैसे गुणों के लिए गुजरने की अनुमति नहीं देनी चाहिए।
आपको अपने वेबपैप में सभी स्थानों को जानना चाहिए जहां आप एचटीएमएसपीसीएचर्स() का उपयोग किए बिना एचटीएमएल में कुछ भी आउटपुट करते हैं, सुनिश्चित करें कि आपको वास्तव में उन स्थानों की आवश्यकता है और यह पता होना चाहिए कि आपके सभी विश्वासों के बावजूद उन स्थानों की संभावित भेद्यताएं हैं।
यदि आप सोच रहे हैं कि यह बहुत सावधानी बरतता है: "मुझे इस चरम को htmlspecialchar() की आवश्यकता क्यों है, मुझे पता है कि इसमें केवल पूर्णांक और सभी कीमती CPU चक्र ढीले हैं?"
इसे याद रखें: आपको नहीं पता, आप केवल इतना ही सोचते हैं कि आप जानते हैं, सीपीयू चक्र दुनिया में सबसे सस्ती चीजें हैं और लगभग सभी डेटाबेस या फाइल सिस्टम या यहां तक कि मेमोरी एक्सेस की प्रतीक्षा करके बर्बाद हो जाएंगे।
कभी भी ब्लैकलिस्ट HTML फ़िल्टर का उपयोग न करें। यूट्यूब ने उस गलती की और किसी को अचानक पता चला कि केवल पहले <script>
हटा दिया गया है और यदि आप टिप्पणी में दूसरा स्थान दर्ज करते हैं तो आप विज़िटर ब्राउज़र में किसी भी जावास्क्रिप्ट को इंजेक्ट कर सकते हैं।
इसी तरह एसक्यूएल इंजेक्शन से बचने के लिए mysql_real_escape_string() के साथ सभी मान जो आप SQL क्वेरी में चिपकते हैं, या बेहतर अभी तक पीडीओ तैयार कथन का उपयोग करें।
मैं प्रदान किए गए अन्य उत्तरों के साथ पूरी तरह से सहमत नहीं हूं इसलिए मैं अपनी सिफारिशें पोस्ट करूंगा।
पढ़ने XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
एचटीएमएल इंजेक्शन अनुशंसित: जब भी कोई उपयोगकर्ता प्रस्तुत सामग्री प्रदर्शित है, यह उचित रूप से अप htmlspecialchars या htmlentities जब ENT_QUOTES को निर्दिष्ट करता है, तो एकल उद्धरण के अंदर इस्तेमाल के साथ साफ किया जाना चाहिए। मैं अनुशंसा करता हूं कि एकल कोट्स में कभी भी encapsulating और हमेशा अपने गुणों को डबल कोट्स में encapsulating (उन्हें छोड़ दें)।
<input value="<?php echo htmlspecialchars($var); ?>" />
<textarea><?php echo htmlspecialchars($var); ?></textarea>
<p><?php echo htmlspecialchars($var); ?></p>
<img width="<?php echo htmlspecialchars($var); ?>" />
जावास्क्रिप्ट इंजेक्शन:: इस तरह के रूप में चीजों पर लागू होता है यह सबसे अच्छा अभ्यास (लेकिन हमेशा व्यावहारिक नहीं) के लिए घटनाओं और जावास्क्रिप्ट में कभी नहीं गूंज उपयोगकर्ता सामग्री है। हालांकि, अगर आप कुछ चीजें करते हैं जो जोखिम को कम करने के लिए किए जा सकते हैं। केवल पूर्णांक आईडी पास करें। यदि आपको किसी प्रकार के विनिर्देशक की आवश्यकता होती है, तो आउटपुट करने से पहले समय से पहले एक श्वेतसूची और/या सशर्त जांच का उपयोग करें। संभावित रूप से उपयुक्त होने पर उपयोगकर्ता सामग्री को अल्फान्यूमेरिक पर मजबूर कर दें; preg_replace("/[^A-Za-z0-9]/", '', $string);
लेकिन यहां पर सावधान रहें कि आप यहां क्या अनुमति देते हैं। केवल उद्धरणों में समाहित होने पर सामग्री शामिल करें और ध्यान दें कि htmlspecialchars/htmlentities यहां आपकी सुरक्षा नहीं करते हैं। इसका उपयोग रनटाइम पर भी किया जाएगा, भले ही इसे एचटीएमएल इकाइयों में अनुवादित किया गया हो। इस तरह के रूप में बातें करने के लिए लागू होता है:
<a href="www.stackoverlow.com/?id=<?php echo (int)$id; ?>">Click</a>
href, src, style, onClick, etc.
ऐसी स्क्रिप्ट टैग आदि के शरीर के रूप में अन्य क्षेत्रों में किसी भी उपयोगकर्ता सामग्री गूंज न करें जब तक कि यह किसी पूर्णांक या कुछ अन्य बहुत बहुत सीमित वर्ण सेट करने के लिए मजबूर कर दिया गया है (यदि आप जानते हैं कि आप क्या कर रहे हैं)।
SQL इंजेक्शन: उपयोग Prepared statements, उन्हें बाँध उपयोगकर्ता सामग्री, और सीधे क्वेरी में उपयोगकर्ता सामग्री सम्मिलित कभी नहीं। मैं आपके विभिन्न मूल विवरण प्रकारों के लिए सहायक कार्यों के साथ तैयार बयानों के लिए कक्षा बनाने की अनुशंसा करता हूं (और विषय पर रहते हुए, अपने सभी डेटाबेस विवरणों को कार्यान्वित करें)। यदि आप तैयार बयानों का उपयोग नहीं करना चुनते हैं तो mysql_real_escape_string() या इसी तरह का उपयोग करें (addlashes() नहीं)। डेटाबेस में संग्रहीत करने से पहले संभव होने पर सामग्री को मान्य करें जैसे पूर्णांक डेटा प्रकार को मजबूर करना/जांचना, प्रकारों पर सशर्त जांच आदि। उचित डेटाबेस कॉलम प्रकार और लंबाई का उपयोग करें। याद रखें कि मुख्य लक्ष्य एसक्यूएल इंजेक्शन को रोकने के लिए है, लेकिन आप वैकल्पिक रूप से यहां HTML/जावास्क्रिप्ट इंजेक्शन सुरक्षा भी कर सकते हैं।
अन्य संसाधन मैंने पहले से ही सार्वजनिक रूप से उपलब्ध एक सरल समाधान खोजने की उम्मीद में ऑनलाइन कुछ शोध किया है। मुझे OWASP ESAPI मिला लेकिन यह काफी दिनांकित प्रतीत होता है। PHP स्थानों के लिंक कई स्थानों पर टूट गए हैं। मेरा मानना है कि मैंने इसे यहां पाया; ESAPI PHP लेकिन फिर से यह काफी दिनांकित और नहीं के रूप में सरल रूप में मैं के लिए उम्मीद थी है। हालांकि आप इसे उपयोगी पा सकते हैं।
कुल मिलाकर, कभी बस यह न मानें कि आप एक onClick विशेषता में htmlentities का उपयोग कर के रूप में इस तरह के सुरक्षित रहते हैं। आपको सही स्थान पर सही टूल का उपयोग करना चाहिए और गलत स्थान पर चीजों को करने से बचाना चाहिए।
संभावित डुप्लिकेट [PHP में कोड इंजेक्शन हमलों को कैसे रोकें?] (Http://stackoverflow.com/questions/1205889/how-to-prevent-code-injection-attacks-in-php) –
@Gert G : मेरा मानना है कि सवाल एसक्यूएल और एक्सएसएस इंजेक्शन के बारे में है ... जावास्क्रिप्ट इंजेक्शन नहीं। – Alerty
नहीं पूरा ओवरलैप - उन तकनीकों को लागू है, लेकिन वहाँ है कि प्रश्न में प्रस्तावित आइटम द्वारा कवर नहीं अन्य उपाय कर रहे हैं। निचे देखो। –