दिलचस्प पोस्ट
कार्यपत्रक डेटा पर SQL- जैसी क्वेरी बनाने के लिए Excel फ़ंक्शन? एंड्रॉइड में स्क्रॉलएव्यू लंबवत और क्षैतिज विज़ुअल स्टूडियो एक्सप्रेस 2005 के साथ मैं पूरी तरह से स्टैटिकली लिंक से जुड़े .exe कैसे बना सकता हूं? एंड्रॉइड एनडीके: बैकट्र्रेस प्राप्त करना अग्रणी शून्य को प्रिंट करने के लिए मैं बीसी (1) कैसे प्राप्त करूं? जावा में दो एक्सएमएल फ़ाइलें मर्ज करें एक XML फ़ाइल के आधार पर MVC 3 में गतिशील रूप से नियंत्रण कैसे बनाएं PHP विधि chaining? eof () बुरा अभ्यास? पायथन से सी / सी ++ कॉलिंग? फ़ाइल को स्विफ्ट में कैसे डाउनलोड करें? iPhone नेविगेशन बार शीर्षक टेक्स्ट का रंग उप-निर्देशिकाओं को संरक्षित करते समय एक जीआईटी रिपॉजिटरी को कैसे विभाजित किया जाए? IntelliJ IDEA प्रोजेक्ट में बाहरी जार (बीबी / *। जार) को जोड़ने का सही तरीका कोणीय 2 तालिका पंक्ति घटक के रूप में

आंशिक रूप से प्रस्तुत करने से पहले escape_javascript क्यों?

मैं इस रेलस्कास्ट प्रकरण को देख रहा हूं और सोच रहा हूं कि escape_javascript से escape_javascript लिए escape_javascript की आवश्यकता क्यों है:

 $("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>"); 

escape_javascript क्या है?

रेल दस्तावेज़ों के अनुसार:

escape_javascript (जावास्क्रिप्ट)

एस्पेरिड कैरियर रिटर्न और सिंगल और डबल कोट्स जावास्क्रिप्ट सेगमेंट के लिए।

लेकिन इसका मतलब मेरे लिए ज्यादा नहीं है

वेब के समाधान से एकत्रित समाधान "आंशिक रूप से प्रस्तुत करने से पहले escape_javascript क्यों?"

क्योंकि आप जावास्क्रिप्ट पोस्ट करने वाले उपयोगकर्ता नहीं चाहते हैं कि ब्राउज़र वास्तव में कार्यान्वित करता है?

यह समझना आसान है कि आपने कोड को दो भागों में विभाजित किया है।

पहला हिस्सा $("#reviews").append("<%= ... %>"); एआरबी के साथ जावास्क्रिप्ट है इसका मतलब यह है कि <%= ... %> को इसके बदले रूबी कोड के अंदर से बदला जाएगा। उस प्रतिस्थापन का परिणाम वैध जावास्क्रिप्ट होना चाहिए, अन्यथा यह एक त्रुटि फेंक देगा जब क्लाइंट उसे संसाधित करने का प्रयास करेगा। तो यह पहली बात है: आपको वैध जावास्क्रिप्ट की आवश्यकता है

ध्यान में रखना एक और बात यह है कि जो कुछ रब्बी उत्पन्न करता है वह जावास्क्रिप्ट स्ट्रिंग के अंदर दोहरे उद्धरण चिह्नों में शामिल होना चाहिए – <%= ... %> आसपास दोहरे उद्धरण नोटिस करें। इसका अर्थ है कि उत्पन्न जावास्क्रिप्ट इस तरह दिखाई देगा:

 $("#reviews").append("..."); 

अब हम <%= ... %> अंदर रूबी भाग की जांच करते हैं। render(:partial => @review) करता है render(:partial => @review) क्या करता है? यह आंशिक रूप प्रदान कर रहा है – जिसका अर्थ है कि यह किसी भी प्रकार का कोड प्रदान कर सकता है – HTML, CSS … या और भी अधिक जावास्क्रिप्ट!

तो, यदि हमारे आंशिक में कुछ सरल HTML होता है, तो यह क्या होता है?

 <a href="/mycontroller/myaction">Action!</a> 

याद रखें कि आपका जावास्क्रिप्ट पैरामीटर के रूप में एक डबल-उद्धृत स्ट्रिंग ले रहा था? अगर हम केवल उस <%= ... %> के कोड के साथ <%= ... %> जगह लेते हैं, तो हमारे पास एक समस्या है – href= एक दोहरे उद्धरण के तुरंत बाद! जावास्क्रिप्ट वैध नहीं होगा:

 // Without escaping, you get a broken javascript string at href $("#reviews").append("<a href="/mycontroller/myaction">Action!</a>"); 

ऐसा न होने के लिए, आप इन विशेष पात्रों से बचना चाहते हैं, ताकि आपकी स्ट्रिंग में कटौती न हो जाए – इसके बदले आपको इसके लिए कुछ चीज की आवश्यकता होती है:

 <a href=\"/mycontroller/myaction\">Action!</a> 

यह क्या escape_javascript करता है यह सुनिश्चित करता है कि लौटे स्ट्रिंग "जावास्क्रिप्ट" को नहीं तोड़ देगा यदि आप इसका उपयोग करते हैं, तो आपको वांछित आउटपुट मिलेगा:

 $("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>") 

सादर!

उपयोगकर्ता दुर्भावनापूर्ण कोड (दुर्भावनापूर्ण उपयोगकर्ता) पोस्ट कर सकते हैं, जो कि यदि अपरिवर्तित छोड़े गए हैं, तो संभावित रूप से निष्पादित हो जाएंगे, जिससे उपयोगकर्ता आपके एप्लिकेशन को नियंत्रित कर सकेंगे।

इसे इस्तेमाल करे:

 <% variable = '"); alert("hi there' %> $("#reviews").append("<%= variable %>"); 

रेल की सिंटैक्स से वास्तव में परिचित नहीं है, लेकिन यदि आप variable बच नहीं सकते तो एक चेतावनी बॉक्स दिखाया जाएगा, और मुझे नहीं लगता कि इसका व्यवहार करना है

यदि आप यहां स्रोत को देखते हैं , तो यह बहुत स्पष्ट होगा।

यह कार्य निम्नलिखित दो चीज़ों को पूरा करता है:

  1. यह इनपुट स्ट्रिंग में अक्षरों को प्रतिस्थापित करता है जो JS_ESCAPE_MAP में परिभाषित होते हैं

    इसका उद्देश्य यह सुनिश्चित करना है कि जावास्क्रिप्ट कोड को बाहरी स्ट्रिंग में बिना किसी दखल के बिना क्रमबद्ध रूप से क्रमबद्ध किया गया है जिसके भीतर इसे एम्बेडेड किया जा रहा है। उदाहरण के लिए यदि आपके पास डबल कोट्स में जावास्क्रिप्ट स्ट्रिंग है तो स्ट्रिंग लीटरल्स के लिए सभी कोट्स को सिंगल कोट्स में होना चाहिए ताकि कोड को तोड़ने से बचा जा सके।

  2. फ़ंक्शन यह भी जांचता है कि परिणामस्वरूप स्ट्रिंग HTML सुरक्षित है यदि ऐसा नहीं है, तो यह सुनिश्चित करने के लिए बचने की आवश्यकता है कि स्ट्रिंग एचटीएमएल सुरक्षित हो और परिणाम को रिटर्न देता है।

जब आप escape_javascript का उपयोग कर रहे हैं, तो इसे आमतौर पर किसी अन्य स्ट्रिंग या मौजूदा HTML गतिशील रूप से एम्बेड किया जा रहा है आपको यह सुनिश्चित करने की ज़रूरत है कि ऐसा करने से आपका पूरा पृष्ठ रेंडर न करें।

इस प्रतिक्रिया के कुछ पहलुओं को अन्य प्रतिक्रियाओं में बताया गया था लेकिन मैं सभी चीजों को एक साथ लाने के लिए चाहता था जिसमें जावास्क्रिप्ट से बचना और एचटीएमएल भागने के बीच का अंतर शामिल है। इसके अलावा, कुछ प्रतिक्रियाओं से पता चलता है कि यह फ़ंक्शन स्क्रिप्ट इंजेक्शन से बचने में मदद करता है। मुझे नहीं लगता कि इस समारोह का उद्देश्य है। उदाहरण के लिए, आपकी समीक्षा में अगर आपकी समीक्षा में चेतावनी ('हैलो वहाँ') है, तो उसे नोड में जोड़कर पॉप-अप को आग नहीं लगाया जाएगा आप इसे एक फ़ंक्शन के अंदर एम्बेड नहीं कर रहे हैं जो पृष्ठ लोड पर ट्रिगर किया गया है या किसी अन्य ईवेंट के माध्यम से। आपके एचटीएमएल के हिस्से के रूप में केवल अलर्ट ('हे वहाँ') का मतलब यह नहीं है कि यह जावास्क्रिप्ट के रूप में निष्पादित होगा

उसने कहा कि मैं यह नहीं मानता कि स्क्रिप्ट इंजेक्शन संभव नहीं है। लेकिन इससे बचने के लिए जब आप उपयोगकर्ता डेटा लेते हैं और इसे अपने डेटाबेस में संग्रहीत करते हैं तो आपको कदम उठाने की आवश्यकता होती है। फ़ंक्शन और उदाहरण जो आप प्रदान कर रहे हैं वह जानकारी प्रदान करने से संबंधित हैं, जो पहले से ही सहेजा गया था।

मुझे उम्मीद है कि यह आपकी मदद करेगा और आपके प्रश्न का उत्तर देगा।

यह आपके द्वारा प्रतिपादित की गई जावास्क्रिप्ट को निष्पादित नहीं करेगा