2010-08-16 13 views
12

यह जिसके बाद वैध जावास्क्रिप्ट की तरह दिखता है पता चला है, नहीं है:एक्सएसएस से बचाने के लिए, इनलाइन जावास्क्रिप्ट ऑब्जेक्ट को एन्कोड करने का सही तरीका क्या है?

<html> 
<body> 
<script> 
json = {test: "</script><script>alert('hello');</script>"}; 
</script> 
</body> 
</html> 

एक ही पाठ, जब एक AJAX API के माध्यम से JSON लौटे बस के रूप में की उम्मीद काम करता है। हालांकि जब मूल एक्सएसएस मुद्दों में इन-लाइन परिणामों को प्रस्तुत किया गया।

एक मनमाना सही JSON स्ट्रिंग को देखते हुए, मुझे इन-लाइन प्रतिपादन के लिए सुरक्षित बनाने के लिए सर्वर पक्ष करने की क्या ज़रूरत है?

संपादित आदर्श रूप में मैं स्ट्रिंग निम्नलिखित के रूप में अच्छी तरह से साथ काम करने के ठीक करना चाहते हैं:

json = {test: "<\/script><script>alert('hello');<\/script>"};

अर्थ, मैं पता नहीं कैसे मेरे अंतर्निहित पुस्तकालय / चार एन्कोडिंग है है, यह हो सकता है इसे एन्कोड करने के लिए चुना है, या यह नहीं हो सकता है। (इसलिए इसकी संभावना एक regex ठीक और अधिक मजबूत है)

+0

असल में, यदि आप इसे ऑनलाइन प्रस्तुत करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि इसमें वर्ण अनुक्रम '' शामिल नहीं है। –

+0

या मुझे लगता है ... मुझे एक साधारण स्ट्रिंग कॉन्सटेनेशन फिक्स के साथ प्रदर्शन के बारे में चिंता है और यह भी कि अन्य अजीब मुद्दे हो सकते हैं, मुझे –

+0

से अवगत नहीं है जब तक कि कुछ अजीब बात न हो, अंतर्निहित लाइब्रेरी स्लैश कैरेक्टर से बच नहीं पाती । जवाक्रिप्ट स्ट्रिंग में इसका कोई विशेष अर्थ नहीं है, इसलिए इससे बचने का कोई कारण नहीं है। – Guffa

उत्तर

3

शुरू में, इस सब पर JSON नहीं है, यह एक जावास्क्रिप्ट ऑब्जेक्ट है। JSON एक टेक्स्ट प्रारूप है जो जावास्क्रिप्ट सिंटैक्स पर आधारित है।

आप यह सुनिश्चित करें कि कोड </ चरित्र संयोजन शामिल नहीं है कर सकते हैं या तो:

var obj = { test: "<"+"/script><script>alert(\"hello\");<"+"/script>" }; 

या यदि आप एक्सएचटीएमएल उपयोग कर रहे हैं यदि आप यह सुनिश्चित कर सकते हैं कि स्क्रिप्ट टैग में सामग्री सादे डेटा के रूप में व्याख्या की है :

<script type="text/javascript"> 
//<![CDATA[ 
var obj = { test: "</script><script>alert(\"hello\");</script>" }; 
//]]> 
</script> 
+0

ने प्रश्न में वाक्यांश को सही किया, इसमें कदम उठाने के लिए स्वतंत्र महसूस करें और इसे और सही करें। "" <"+"/"थोड़ा iffy प्रदर्शन के अनुसार लगता है, सीडीएटीए समाधान वास्तव में सुरुचिपूर्ण –

+0

वास्तव में इसके बारे में सोच रहा है, 'gsub ("

+0

@ सैम केसर: हाँ, बैकस्लैश का उपयोग करके ' Guffa

2

शाब्दिक तार में, एक बैकस्लैश (\) सभी से पहले "असुरक्षित" फ़ॉरवर्ड स्लैश जो "</script>" (/   →   \/) में होता है सहित वर्ण, डाल दिया।

यह करने के लिए अपने उदाहरण बदल जाएगा:

json = {test: "<\/script><script>alert(\"hello\");<\/script>"}; 

और यह अभी भी मान्य JSON होगा।

बेशक

आप भी दोहरे-उद्धरण ("   →   \") और बैकस्लैश ही (\   →   \\) से बचने के लिए है, लेकिन आप पहले से ही ऐसा करने के लिए वैसे भी होगा। सुरक्षित पक्ष पर रहने के लिए आपको सिंगल-कोट ('   →   \') से बचने पर भी विचार करना चाहिए।

+0

तो एक साधारण प्रतिस्थापन ("/", "\ /") करना चाहिए? किसी भी अन्य किनारे के मामलों? –

+0

@ सैम केसर: हाँ, डबल-कोट्स, सिंगल-कोट्स और बैकस्लाश का ख्याल रखें। मेरा संपादित उत्तर देखें। – Timwi

+0

ठंडा, yerp मैं पहले से ही उन एन्कोड किया था, मेरे प्रश्न का विस्तार थोड़ा बालों वाले नमूने के साथ। –

1

मैंने पाया पात्रों में से this सूची JSON तार के लिए भाग निकले जा रहे हैं:

\b Backspace (ascii code 08) 
\f Form feed (ascii code 0C) 
\n New line 
\r Carriage return 
\t Tab 
\v Vertical tab 
\' Apostrophe or single quote 
\" Double quote 
\\ Backslash character 

पीएचपी का उपयोग? यदि ऐसा है तो: json_encode

echo json_encode("<\/script><script>alert(\"hello\");<\/script>"); 

आउटपुट:

"<\\\/script><script>alert(\"hello\");<\\\/script>" 

एक और उदाहरण:

echo json_encode("</script><script>alert(\"hello\");</script>"); 

आउटपुट:

"<\/script><script>alert(\"hello\");<\/script>" 
+0

क्या वह आगे स्लैश से बचता है? सहायता पृष्ठ नहीं कहता है। (वास्तव में, यह नहीं कहता कि * किसी भी * विकल्प का मतलब क्या है।) – Timwi

+0

जोड़ा गया उदाहरण, ऐसा लगता है कि यह आगे स्लैश से बचता है :) –

+0

क्या आप एल्गोरिदम पर विस्तार कर सकते हैं जिसका उपयोग करना चाहिए? मैं PHP –

4

देखें OWASP's XSS prevention guide (देखें नियम 3 #) -

सिवाय अल्फान्यूमेरिक वर्णों के लिए, को स्क्रिप्ट संदर्भ में या विशेषता में डेटा मान से बाहर स्विच करने के लिए \ xHH प्रारूप के साथ 256 से कम सभी वर्णों से बचें। किसी भी भागने शॉर्टकट \ की तरह "

का उपयोग न करें, क्योंकि बोली चरित्र एचटीएमएल विशेषता पार्सर जो पहले से चलाता है के अनुरूप किया जा सकता है मान लें कि यह कैसे अपने वस्तु की तरह लग रहा है -।


var log = { 
trace: function(m1, m2, m3){}, 
debug: function(m1, m2, m3){}, 
currentLogValue : "trace {].a23-%\/^&", 
someOtherObject : {someKey:"somevalue", someOtherKey:"someothervalue"} 
}; 

यह इस तरह खत्म करना चाहिए -


var log = { 
trace : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D", 
debug : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D", 
currentLogValue : "trace\x20\x7B\x5D.a23\x2D\x25\x5C\x2F\x5E\x26", 
someOtherObject : {someKey : "somevalue", someOtherKey:"someothervalue"} 
}; 

नियम सरल कर रहे हैं -

  1. अविश्वसनीय डेटा केवल उद्धरण की एक जोड़ी के भीतर अनुमति दी है
  2. जो भी उद्धरण के भीतर है इस प्रकार से बच गया हो जाता है - "अक्षरांकीय वर्णों को छोड़कर, \ xHH प्रारूप के साथ सब कुछ से बचने"

यह सुनिश्चित करता है कि अविश्वसनीय डेटा हमेशा स्ट्रिंग के रूप में व्याख्या किया जाता है, न कि फ़ंक्शन/ऑब्जेक्ट/कुछ और के रूप में।

2

एक समस्या जो आप चल रहे हो यह तथ्य यह है कि ब्राउज़र पर HTML और जावास्क्रिप्ट दुभाषिया इंटरलीव किए जाते हैं।

<html> 
<body> 
<script> 
json = {test: "</script><script>alert('hello');</script>"}; 
</script> 
</body> 
</html> 

अपने उदाहरण में, HTML दुभाषिया js दुभाषिया के लिए json = {test: " दे देंगे और फिर इसे अगले जावास्क्रिप्ट ब्लॉक (<script> और </script> टैग द्वारा सीमांकित) खोजने के लिए और जे एस दुभाषिया के लिए alert('hello'); दे देंगे। इससे कोई फर्क नहीं पड़ता कि </script> टैग जावास्क्रिप्ट स्ट्रिंग में है, क्योंकि एचटीएमएल दुभाषिया जेएस कोड ब्लॉक की तलाश में है और जेएस स्ट्रिंग को समझ में नहीं आता है।

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

संबंधित मुद्दे

 संबंधित मुद्दे