2012-03-28 12 views
13

मेरे एचटीएमएल 5 एप्लिकेशन का एक उपयोगकर्ता अपना नाम किसी फॉर्म में दर्ज कर सकता है, और यह नाम कहीं और प्रदर्शित किया जाएगा। अधिक विशेष रूप से, यह कुछ HTML तत्वों के innerHTML बन जाएगा।दोजो टूलकिट: एचटीएमएल स्ट्रिंग से कैसे बचें?

समस्या यह है कि यदि कोई फॉर्म में वैध HTML मार्कअप दर्ज करता है, तो इसका उपयोग किया जा सकता है, यानी कुछ प्रकार के HTML इंजेक्शन, यदि आप करेंगे।

उपयोगकर्ता का नाम केवल क्लाइंट पक्ष पर संग्रहीत और प्रदर्शित होता है, अंत में उपयोगकर्ता स्वयं ही प्रभावित होता है, लेकिन यह अभी भी मैला है।

क्या डोजो में innerHTML तत्वों में इसे रखने से पहले स्ट्रिंग से बचने का कोई तरीका है? मुझे लगता है कि एक बिंदु पर डोजो ने वास्तव में ऐसा फ़ंक्शन किया था (dojo.string.escape()) लेकिन यह संस्करण 1.7 में मौजूद नहीं है।

धन्यवाद।

उत्तर

16
dojox.html.entities.encode(myString); 
+0

एक आकर्षण की तरह काम करता है और मुझे पहिया को फिर से शुरू करने की आवश्यकता नहीं है। धन्यवाद! –

0

चेक dojo.replace के इस उदाहरण:

require(["dojo/_base/lang"], function(lang){ 
    function safeReplace(tmpl, dict){ 
    // convert dict to a function, if needed 
    var fn = lang.isFunction(dict) ? dict : function(_, name){ 
     return lang.getObject(name, false, dict); 
    }; 
    // perform the substitution 
    return lang.replace(tmpl, function(_, name){ 
     if(name.charAt(0) == '!'){ 
     // no escaping 
     return fn(_, name.slice(1)); 
     } 
     // escape 
     return fn(_, name). 
     replace(/&/g, "&"). 
     replace(/</g, "&lt;"). 
     replace(/>/g, "&gt;"). 
     replace(/"/g, "&quot;"); 
    }); 
    } 
    // that is how we use it: 
    var output = safeReplace("<div>{0}</div", 
    ["<script>alert('Let\' break stuff!');</script>"] 
); 
}); 

स्रोत: http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions

0

मैं पता लगाने के लिए अन्य पुस्तकालयों इस समारोह को लागू करने की कोशिश की और मैं निम्नलिखित MooTools से करने के विचार चुरा लिया:

var property = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; 
elem[property] = "<" + "script" + ">" + "alert('a');" + "</" + "script" + ">"; 

तो म्यूटूल के अनुसार या तो आंतरिक टेक्स्ट या टेक्स्ट सामग्री संपत्ति है जो HTML से बच सकती है।

5

डोजो एचटीएमएल बचने के लिए मॉड्यूल dojox/html/entities है। दुर्भाग्यवश, the official documentation अभी भी केवल पूर्व -77, गैर-एएमडी उदाहरण प्रदान करता है।

यहाँ एक उदाहरण है कि कैसे एएमडी के साथ कि मॉड्यूल का उपयोग करने के लिए:

var str = "<strong>some text</strong>" 
require(['dojox/html/entities'], function(entities) { 
var escaped = entities.encode(str) 
console.log(escaped) 
}) 

आउटपुट:

&lt;strong&gt;some text&lt;/strong&gt;

0

डोजो 1.10 के रूप में, भागने समारोह अभी भी का हिस्सा है स्ट्रिंग मॉड्यूल।

http://dojotoolkit.org/api/?qs=1.10/dojo/string

यहाँ आप यह कैसे एक साधारण टेम्पलेट प्रणाली के रूप में उपयोग कर सकते हैं।

require([ 
    'dojo/string' 
], function(
    string 
){ 
    var template = '<h1>${title}</h1>'; 
    var message = {title: 'Hello World!<script>alert("Doing something naughty here...")</script>'} 
    var html = string.substitute(
     template 
     , message 
     , string.escape 
    ); 
}); 
संबंधित मुद्दे