2010-01-05 27 views
177

मैं डेटाबेस से मूल्यों को आउटपुट कर रहा हूं (यह वास्तव में सार्वजनिक प्रविष्टि के लिए खुला नहीं है, लेकिन यह कंपनी में किसी उपयोगकर्ता द्वारा प्रविष्टि के लिए खुला है - यानी, मैं XSS के बारे में चिंतित नहीं हूं।)जावास्क्रिप्ट में उद्धरण उद्धरण

मैं उत्पादन के लिए इस तरह एक टैग कोशिश कर रहा हूँ:

Prelim Assess "Mini" Report 

मैं जगह "की कोशिश की है:

<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a> 

वर्णन वास्तव में कुछ इस तरह है कि डेटाबेस से एक मूल्य है \ ", लेकिन इससे कोई फर्क नहीं पड़ता कि, मैं शब्द का आकलन करने के बाद अंतरिक्ष के बाद अपने जावास्क्रिप्ट कॉल को रोक रहा हूं, और यह सभी प्रकार के मुद्दों का कारण बन रहा है।

मुझे स्पष्ट उत्तर को याद रखना होगा, लेकिन मेरे जीवन के लिए मैं इसे समझ नहीं सकता।

कोई भी मेरी मूर्खता को इंगित करने की देखभाल करता है?

यहाँ पूरे HTML पृष्ठ (यह एक ASP.NET पेज अंततः हो जाएगा, लेकिन यह हल करने के लिए मैं सब कुछ लेकिन समस्या यह कोड बाहर ले) है

<html> 
    <body> 
     <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a> 
    </body> 
</html> 
+3

यह अपने 'onclick' घटना लगाव विनीत बनाने के लिए एक अच्छा विचार है और अपनी सभी डेटाबेस जानकारी को डेटा द्वीप में स्थानांतरित करने के लिए। चीजें साफ़ हो जाएंगी और जब आपके तार गलत तरीके से बच जाएंगे तो आपको वास्तव में कुछ प्रकार की वाक्यविन्यास त्रुटि मिल जाएगी। –

+1

* के संभावित डुप्लिकेट * [मैं ऑनक्लिक हैंडलर के अंदर जावास्क्रिप्ट कोड के अंदर एक स्ट्रिंग से कैसे बचूं?] (Http://stackoverflow.com/questions/97578/how-do-i-escape-a-string-inside-javascript- कोड-अंदर-एक-onclick-हैंडलर) *। –

उत्तर

177

आप स्ट्रिंग आप कर रहे हैं से बचने के लिए की जरूरत है डबल-कोट वर्णों को साफ़ करने के लिए DoEdit में लिखना। वे समय-समय पर बंद करने के लिए onclick HTML विशेषता उत्पन्न कर रहे हैं।

जावास्क्रिप्ट से बचने वाले वर्ण का उपयोग, \, HTML संदर्भ में पर्याप्त नहीं है। आपको डबल-कोट को उचित XML इकाई प्रतिनिधित्व, &quot; के साथ प्रतिस्थापित करने की आवश्यकता है।

+0

ठीक है, लेकिन यह नहीं होगा? edit मैंने कोशिश की, और यह अभी भी खराब हो रहा है। यह एक साधारण डब्ल्यूटीएफ होना है, लेकिन मेरे जीवन के लिए, मैं इसे नहीं देख सकता। –

+17

और स्पष्ट रूप से मैं पढ़ नहीं सकता। जवाब के लिए धन्यवाद। –

+0

क्या कोई अंतर्निहित जावास्क्रिप्ट फ़ंक्शन है जो डबल कोट्स से बच जाएगा? 'quo' 'के अलावा। प्रतिस्थापित करें (' '', '"') मुझे कुछ भी नहीं मिला। – kevin

1

मैं एक नमूना एक किया है jQuery

var descr = 'test"inside"outside'; 
$(function(){ 
    $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');  
}); 

function DoEdit(desc) 
{ 
    alert (desc); 
} 

का उपयोग कर और यह इंटरनेट   एक्सप्लोरर और फायरफॉक्स काम करता है।

+5

बेशक यह करता है, क्योंकि आप इसे सीधे विशेषता में नहीं डाल रहे हैं। अपनी विधि का उपयोग करने के लिए, मुझे जेएस स्ट्रिंग्स की एक सरणी बनाना होगा, फिर $ ("# divxxx") की मनमानी संख्या ... असाइनमेंट करें। इष्टतम से कम, लेकिन सुझाव के लिए धन्यवाद। –

10

समस्या यह है कि एचटीएमएल बचने वाले चरित्र को नहीं पहचानता है। आप HTML विशेषता के लिए सिंगल कोट्स और ऑनक्लिक के लिए डबल कोट्स का उपयोग करके उस पर काम कर सकते हैं।

<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a> 
+4

यिक्स। मैं सोच रहा था कि मैंने अतीत में विशेषता के लिए स्वाभाविक रूप से उपयोग क्यों किया। मैंने बस इतना गहराई से इसमें कभी नहीं पहुंचाया। धन्यवाद। –

33
<html> 
    <body> 
     <a href="#" onclick="DoEdit('Preliminary Assessment &quot;Mini&quot;'); return false;">edit</a> 
    </body> 
</html> 

चाल करना चाहिए।

0

व्हाइटस्पेस से बचें। यह मुझे लगता है जैसे फ़ायरफ़ॉक्स एक के बजाय तीन तर्क ग्रहण कर रहा है। &nbsp; गैर-ब्रेकिंग स्पेस कैरेक्टर है। भले ही यह पूरी समस्या न हो, फिर भी यह एक अच्छा विचार हो सकता है।

22

लोग, वहाँ पहले से ही है जो करता है \" के लिए न छोड़ने जावास्क्रिप्ट में unescape समारोह:

<script type="text/javascript"> 
    var str="this is \"good\""; 
    document.write(unescape(str)) 
</script> 
+2

"बचने"/"अनदेस्केप" का एक संयोजन जो मुझे चाहिए था। धन्यवाद। –

+7

भागने/अनदेखा को बहिष्कृत कर दिया गया है। हालांकि encodeURI सिर्फ उद्धरण से अधिक करता है। http://gotochriswest.com/blog/2011/05/23/escape-unescape-deprecated/ – chug2k

2

आप जावा में HTML कोडांतरण रहे हैं, तो आप अपाचे कॉमन्स-लैंग से यह अच्छा उपयोगिता वर्ग का उपयोग कर सकते सभी से बचने के लिए सही ढंग से करने के लिए:

org.apache.commons.lang।StringEscapeUtils
जावा, जावा स्क्रिप्ट, एचटीएमएल, एक्सएमएल, और एसक्यूएल के लिए स्ट्रिंग्स स्ट्रैप्स से निकलता है और अनचेक करता है।

+0

मैं जावा में methodExpression बनाने के लिए org.apache.commons.lang3.StringEscapeUtils.escapeEcmaScript (टेक्स्ट) का उपयोग करता हूं। धन्यवाद। – Harun

76

&quot; एचटीएमएल संदर्भ की वजह से मेरे सामने सुझाए गए इस विशेष मामले में काम करेगा।

हालांकि, अगर आप अपना JavaScript कोड स्वतंत्र रूप से किसी भी संदर्भ के लिए भाग निकले होना चाहते हैं, तो आप देशी जावास्क्रिप्ट एन्कोडिंग के लिए चुनते सकता है:
'\x27
" हो जाता है \x22

तो अपने onclick बन जाएगा हो जाता है:
DoEdit('Preliminary Assessment \x22Mini\x22');

यह उदाहरण के लिए काम करेगा जब जावास्क्रिप्ट स्ट्रिंग को किसी अन्य जावास्क्रिप्ट विधि (alert() पर पैरामीटर के रूप में पास करना एक आसान है इसके लिए परीक्षण विधि)।

मैं आपको डुप्लिकेट स्टैक ओवरफ़्लो प्रश्न, How do I escape a string inside JavaScript code inside an onClick handler? पर संदर्भित कर रहा हूं।

+0

यह मेरे लिए काम किया –

+2

धन्यवाद! आपका सही जवाब है क्योंकि संदर्भ के बावजूद यह देशी जावास्क्रिप्ट है। – scarver2

+0

यह सही उत्तर है, हालांकि, '"' का उपयोग कर एक HTML संदर्भ में, निश्चित रूप से, काम करेगा। – Oliver

0

मैं यह कैसे करता हूं, मूल रूप से str.replace(/[\""]/g, '\\"')

var display = document.getElementById('output'); 
 
var str = 'class="whatever-foo__input" id="node-key"'; 
 
display.innerHTML = str.replace(/[\""]/g, '\\"'); 
 

 
//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>

0

आप डबल बैकस्लैश के साथ उद्धरण से बचने के लिए की जरूरत है।

यह (PHP के json_encode द्वारा उत्पादित) विफल रहता है:

<script> 
    var jsonString = '[{"key":"my \"value\" "}]'; 
    var parsedJson = JSON.parse(jsonString); 
</script> 

यह काम करता है:

<script> 
    var jsonString = '[{"key":"my \\"value\\" "}]'; 
    var parsedJson = JSON.parse(jsonString); 
</script> 
0

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

मान्य स्ट्रिंग उदाहरण:

'हैलो'

'नमस्ते', 'वर्ल्ड'

'नमस्ते', 'वर्ल्ड'

'नमस्ते', 'दुनिया', ' '

' यह मेरी दुनिया 'है,' मेरे बिना इसका आनंद नहीं ले सकता।',' आपका स्वागत है, अतिथि '

HTML:

<tr> 
    <td> 
     <label class="control-label"> 
      String Field: 
     </label> 
     <div class="inner-addon right-addon"> 
      <input type="text" id="stringField" 
        name="stringField" 
        class="form-control" 
        autocomplete="off" 
        data-rule-required="true" 
        data-msg-required="Cannot be blank." 
        data-rule-commaSeparatedText="true" 
        data-msg-commaSeparatedText="Invalid comma separated value(s)."> 
     </div> 
    </td> 

जावास्क्रिप्ट:

/** 
* 
* @param {type} param1 
* @param {type} param2 
* @param {type} param3 
*/ 
jQuery.validator.addMethod('commaSeparatedText', function(value, element) { 

    if (value.length === 0) { 
     return true; 
    } 
    var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$"); 
    return expression.test(value); 
}, 'Invalid comma seperated string values.'); 
संबंधित मुद्दे