2012-11-20 16 views
8

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

  • जब मैं करने की कोशिश की jQuery.text ("untrusted_data") या element.text = untrusted_data, ब्राउज़र पूरी तरह से सामग्री एन्कोडिंग जा करने के लिए है, लेकिन मैं कहीं और है कि क्लाइंट-साइड पढ़ लिया है लगता है एन्कोडिंग पर भरोसा नहीं किया जाना चाहिए और आपको "हमेशा" सर्वर-साइड पर एन्कोड करना होगा। क्लाइंट-साइड एन्कोडिंग क्यों सुरक्षित नहीं माना जाता है?

  • जब भी मैं jQuery.val (untrusted_data) या element.value = untrusted_data यह काफी सुरक्षित हो रहा है का उपयोग कर मान सेट करने की कोशिश की। तो क्या यह वास्तव में एक्सएसएस सुरक्षित है या क्या मुझे यहां कोई मामला याद आया?

  • इसके अलावा, मैं कहीं कि jQuery.setAttribute (attrName, untrusted_data) और setAttribute (attrName, untrusted_data) आम तौर पर सुरक्षित माना जाता है केवल अगर विशेषता नाम यूआरएल संदर्भ आधारित विशेषताओं को शामिल नहीं करता पढ़ने के लिए हो (src, href आदि) या इवेंट हैंडलर (ऑनक्लिक, ऑनमाउस ओवर आदि)। यदि ऐसा है, तो मैं setAttribute ("href", untrusted_data) का उपयोग कर एक href विशेषता कैसे सेट करूँ? सर्वर से तरफ encodeForHtmlAttribute (untrusted_data) दृष्टिकोण का सही तरीका है?
  • मुझे गतिशील HTML निर्माण को कैसे संभालना चाहिए। नीचे दिए गए उदाहरण

<div id="divName1" onClick="copyData()">untrusted_data</div> <div id="divName2"></div>

function copyData() 
{ 
    var divValue = jQuery("#divName1").html(); 
    jQuery("#divName2").html(divValue);/XSS Here 
} 

क्या मैं यहाँ हासिल करना चाहते हैं divName1 से पाठ हो और divName2 की सामग्री के लिए पेस्ट करना है पर विचार करें। मैंने जो कोड लिखा है वह एक्सएसएस कमजोर है। मैं

jQuery ("# divName2") को बदल सकते हैं। पाठ (divValue)

तो, यह इनकोडिंग को सुनिश्चित करेगा, लेकिन के रूप में मैं समझ गया, हम कहते हैं कि क्लाइंट-साइड एन्कोडिंग असुरक्षित है और केवल सर्वर-साइड एन्कोडिंग का उपयोग किया जाना चाहिए। क्लाइंट-साइड एन्कोडिंग का उपयोग किए बिना मैं XSS सुरक्षित होने के लिए इसे कैसे लिखूं? मैं थोड़ा यहाँ उलझन :(हूँ। कृपया मेरी मदद करो बाहर इन संदेहों को स्पष्ट करने के लिए।

+0

'element.text' स्वयं सुरक्षित है, लेकिन यदि आप क्लाइंट कोड को डेटा पास करने के लिए स्ट्रिंग इंटरपोलेशन का उपयोग करते हैं तो आपको समस्याएं आ सकती हैं। –

उत्तर

8

यह एक बार में ढेर सारे प्रश्न है।

क्यों क्लाइंट साइड एन्कोडिंग सुरक्षित नहीं माना जाता है?

क्लाइंट-साइड एन्कोडिंग ठीक है जब तक यह ठीक से और लगातार किया जाता है।क्लाइंट-साइड एन्कोडिंग में अक्सर निचला पट्टी होता है क्योंकि इसे यूटीएफ -7 हमलों जैसे चरित्र-एन्कोडिंग स्तर के हमलों के बारे में चिंता करने की आवश्यकता नहीं होती है।

जब भी मैंने jQuery.val (untrusted_data) या element.value = untrusted_data का उपयोग करके मान सेट करने का प्रयास किया, तो यह पर्याप्त सुरक्षित प्रतीत होता है। तो क्या यह वास्तव में एक्सएसएस सुरक्षित है या क्या मुझे यहां कोई मामला याद आया?

untrusted_data मान लिया जाये कि एक स्ट्रिंग और तत्व जिसका मान सेट किया जा रहा है एक प्रवाह या ब्लॉक तत्व में एक नियमित पाठ नोड है तो तुम ठीक हो जाती है। यदि नोड जिसका मूल्य असाइन किया जा रहा है, तो आप परेशानी में भाग सकते हैं <script> तत्व या एक यूआरएल, इवेंट हैंडलर, या स्टाइल एट्रिब्यूट नोड या <object> से संबंधित कुछ भी एक टेक्स्ट नोड है।

इसके अलावा, मैं कहीं कि jQuery.setAttribute (attrName, untrusted_data) और setAttribute (attrName, untrusted_data) आम तौर पर सुरक्षित माने जाते हैं केवल यदि विशेषता नाम यूआरएल संदर्भ आधारित विशेषताएं (src, href शामिल नहीं है पढ़ने के लिए हो इत्यादि) या इवेंट हैंडलर (ऑनक्लिक, ऑनमाउस ओवर आदि)। यदि ऐसा है,

यह आंशिक रूप से सही है। अन्य विशेषताओं में style जैसे तेज किनारों और <object> और <embed>, और <meta> से संबंधित कई चीजें हैं।

यदि आप विशेषता के बारे में ज्यादा नहीं जानते हैं तो इसे अविश्वसनीय डेटा पर बेनकाब न करें। आम तौर पर सुरक्षित होने वाली चीजें वे गुण हैं जिनमें title जैसी टेक्स्ट सामग्री शामिल है, या जिनके मान dir=ltr और dir=rtl जैसे मानते हैं।

एक बार जब आप उन विशेषताओं से निपट रहे हैं जो अधिक जटिल मूल्य लेते हैं तो आपको -moz-binding जैसे style विशेषताओं में अस्पष्ट ब्राउज़र एक्सटेंशन का शोषण करने वाले हमलावरों का खतरा होता है।

यह काफी

बारूदी सुरंगों जब तक आप उन्हें पर कदम सुरक्षित होने लगते हैं सुरक्षित हो रहा है।

आप "सुरक्षित लग रहे" से कुछ निष्कर्ष निकाला नहीं जा सकता। आपको वास्तव में इसे देखने और समझने की आवश्यकता है कि संभावित रूप से क्या गलत हो सकता है, और चीजें व्यवस्थित कर सकते हैं ताकि आप केवल जोखिम में हों जब गलत चीजों का एक सही तूफान हो (पी (आपदा) = पी (विफलता 0) * पी (विफलता 1) * ...) और यह कि आपको जोखिम में नहीं है जब केवल एक चीज गलत हो जाती है (पी (आपदा) = पी (विफलता 0) + पी (विफलता 1) * पी (! विफलता 0) + ...)।

मुझे setAttribute ("href", untrusted_data) का उपयोग करके एक href विशेषता कैसे सेट करना है?

प्रोटोकॉल को श्वेतसूची के बिना ऐसा न करें।

if (!/^https?:\/\//i.test(untrusted_data) && !/^mailto:/i.test(untrusted_data)) { 
    throw new Error('unsafe'); 
} 

encodeForHtmlAttribute (untrusted_data) सर्वर साइड से दृष्टिकोण का सही तरीका है?

सं एचटीएमएल setAttribute को भेजे गए मान एन्कोडिंग अनावश्यक है और किसी भी सुरक्षा गुण की रक्षा में मदद नहीं करेगा। <iframe srcdoc> एक दुर्लभ अपवाद हो सकता है क्योंकि इसकी सामग्री HTML है यदि हाल ही में spec परिवर्तनों की मेरी यादें सही हैं।

जो मैं यहां प्राप्त करना चाहता हूं वह है divName1 से टेक्स्ट प्राप्त करना और इसे divName2 की सामग्री में पेस्ट करना। मैंने जो कोड लिखा है वह एक्सएसएस कमजोर है।

एचटीएमएल के साथ चारों ओर मत बनो। ब्राउज़र्स '.innerHTML गेटर्स छोटी हैं और कभी-कभी आईई में मूल्य डिलीमीटर के रूप में कार्य करने वाले बैकटिक्स के साथ शोषण की ओर जाता है। नोड्स को एक से दूसरे तक क्लोन करें। नीचे की तरह कुछ यह करना चाहिए:

var div1 = $('#divName1'); 
for (var child = div1[0].firstChild(); child; child = child.nextSibling) { 
    $('#divName2').append([child.cloneNode(true)]); 
} 

मैं

jQuery("#divName2").text(divValue) 

अगर सभी आप चाहते हैं शाब्दिक सामग्री है कि ठीक है के लिए बदल सकते हैं।

+1

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

+2

'लैंडमाइन्स सुरक्षित होने लगते हैं जब तक आप उन पर कदम नहीं उठाते।' यह किसी भी प्रकार के आईटी सुरक्षा मुद्दे के लिए कभी भी सबसे अच्छा सारांश है, जहां प्रस्तावित समाधान 'पर्याप्त सुरक्षित लग रहा था' ... – ppeterka

+0

@ माइक धन्यवाद विस्तृत उत्तर :) –