जवाबों:
सुरक्षा नोट: इस उत्तर का उपयोग करना (नीचे अपने मूल रूप में संरक्षित) आपके आवेदन में एक XSS भेद्यता का परिचय दे सकता है । आपको इस उत्तर का उपयोग नहीं करना चाहिए। इस उत्तर में कमजोरियों की व्याख्या के लिए लुकासैरो का जवाब पढ़ें , और उस उत्तर या मार्क अमेरी के उत्तर के बजाय दृष्टिकोण का उपयोग करें ।
वास्तव में, प्रयास करें
var decoded = $("<div/>").html(encodedStr).text();
$("<div/>").html('<img src="http://www.google.com/images/logos/ps_logo2.png" onload=alert(1337)>')
। फ़ायरफ़ॉक्स या सफारी में यह अलर्ट फायर करता है।
str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "")
या ऐसा ही कुछ।
बिना किसी jQuery के:
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
console.log(decodeEntities('1 & 2')); // '1 & 2'
यह स्वीकृत उत्तर के समान काम करता है , लेकिन अविश्वसनीय उपयोगकर्ता इनपुट के साथ उपयोग करना सुरक्षित है।
जैसा कि माइक सैमुअल ने उल्लेख किया है , <div>
एक <textarea>
अविश्वसनीय उपयोगकर्ता इनपुट के बजाय ऐसा करना एक XSS भेद्यता है, भले ही <div>
इसे DOM में कभी नहीं जोड़ा गया हो:
function decodeEntities(encodedString) {
var div = document.createElement('div');
div.innerHTML = encodedString;
return div.textContent;
}
// Shows an alert
decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">')
हालाँकि, यह हमला संभव नहीं है <textarea>
क्योंकि इसमें ऐसे HTML तत्व नहीं हैं जिनकी अनुमति सामग्री है <textarea>
। नतीजतन, 'एन्कोडेड' स्ट्रिंग में मौजूद कोई भी HTML टैग स्वचालित रूप से ब्राउज़र द्वारा इकाई-एनकोड हो जाएगा।
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
// Safe, and returns the correct answer
console.log(decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">'))
चेतावनी : इस jQuery का उपयोग कर रहा
.html()
है और.val()
उपयोग करने के बजाए तरीकों.innerHTML
और.value
भी jQuery के कुछ संस्करणों के लिए असुरक्षित * है, जब एक का उपयोग कर भीtextarea
। ऐसा इसलिए है क्योंकि jQuery के पुराने संस्करण जानबूझकर और स्पष्ट रूप से स्ट्रिंग में निहित लिपियों का मूल्यांकन करते हैं.html()
। इसलिए इस तरह कोड jQuery 1.8 में एक चेतावनी दिखाता है:
//<!-- CDATA
// Shows alert
$("<textarea>")
.html("<script>alert(1337);</script>")
.text();
//-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
* इस भेद्यता को पकड़ने के लिए इरु पेनकमान का धन्यवाद ।
decodedString = textArea.value;
textArea.remove();
return decodedString;
if ('remove' in Element.prototype) textArea.remove();
$("<div />").html(string).text()
प्रदान की गई स्ट्रिंग में किसी भी जावास्क्रिप्ट को निष्पादित करेगा , जो मुझे संदेह है कि आपकी समस्या का कारण क्या था। स्वीकृत उत्तर को इस पर अद्यतन किया जाना चाहिए।
जैसे माइक सैमुअल ने कहा, HTML संस्थाओं को असुरक्षित करने के लिए jQuery.html ()। टेक्स्ट () का उपयोग न करें।
इसके बजाय, की तरह एक टेम्पलेट रेंडरर का उपयोग Mustache.js या decodeEntities @ VyvIT की टिप्पणी से।
Underscore.js उपयोगिता-बेल्ट लाइब्रेरी escape
और unescape
विधियों के साथ आता है , लेकिन वे उपयोगकर्ता इनपुट के लिए सुरक्षित नहीं हैं:
unescape
डॉक्स में अब तक शामिल हैं, btw।
_.unescape("'")
केवल "& # 39;" में परिणाम एक एकल-उद्धरण के बजाय। क्या ऐसा कुछ है जो मुझे याद आ रहा है या HTML इकाई कोडों में अंडरस्कोर नहीं है जैसा कि दिखाया गया है: w3schools.com/tags/ref_entities.asp
escape
और unescape
तरीके ... उपयोगकर्ता इनपुट के लिए सुरक्षित नहीं हैं" । इससे तुम्हारा क्या मतलब? यह मुझे बकवास लगता है, लेकिन शायद मुझे कुछ याद आ रहा है - क्या आप स्पष्ट कर सकते हैं?
_.unescape("<img src=fake onerror=alert('boo!')>")
(Chrome / FF / IE में)। लेकिन यह कोई सतर्क नहीं दिखा। इसे कंसोल में आज़माया और साथ ही इसे मेरी जेएस फाइल में भी डाला। एक ही परिणाम।
मुझे लगता है कि आप पाठ और HTML विधियों को भ्रमित कर रहे हैं। इस उदाहरण को देखें, यदि आप किसी तत्व के आंतरिक HTML को पाठ के रूप में उपयोग करते हैं, तो आपको HTML टैग (दूसरा बटन) डीकोड मिल जाएगा। लेकिन यदि आप उन्हें HTML के रूप में उपयोग करते हैं, तो आपको HTML स्वरूपित दृश्य (पहला बटन) मिलेगा।
<div id="myDiv">
here is a <b>HTML</b> content.
</div>
<br />
<input value="Write as HTML" type="button" onclick="javascript:$('#resultDiv').html($('#myDiv').html());" />
<input value="Write as Text" type="button" onclick="javascript:$('#resultDiv').text($('#myDiv').html());" />
<br /><br />
<div id="resultDiv">
Results here !
</div>
पहला बटन लिखते हैं: यहाँ एक HTML सामग्री है।
दूसरा बटन लिखते हैं: यहां एक <B> HTML </ B> सामग्री है।
वैसे, आप एक प्लग-इन देख सकते हैं जो मुझे jQuery प्लगइन में मिला है - HTML डीकोड और एनकोड करें जो एन्कोड करता है और HTML स्ट्रिंग्स को डीकोड करता है।
प्रश्न 'jQuery के साथ' द्वारा सीमित है, लेकिन यह जानने में कुछ मदद कर सकता है कि यहाँ दिए गए सर्वोत्तम उत्तर में दिया गया jQuery कोड निम्न कार्य करता है ... यह jQuery के साथ या उसके बिना काम करता है:
function decodeEntities(input) {
var y = document.createElement('textarea');
y.innerHTML = input;
return y.value;
}
आप https://github.com/mathiasbynens/he से उपलब्ध हे लाइब्रेरी का उपयोग कर सकते हैं
उदाहरण:
console.log(he.decode("Jörg & Jürgen rocked to & fro "));
// Logs "Jörg & Jürgen rocked to & fro"
मैंने लाइब्रेरी के लेखक को इस सवाल पर चुनौती दी कि क्या इस लाइब्रेरी को क्लाइंटसाइड कोड में <textarea>
हैक के पक्ष में उपयोग करने का कोई कारण था जो अन्य उत्तरों में प्रदान किया गया है। उन्होंने कुछ संभावित औचित्य प्रदान किए:
यदि आप नोड.जेएस सर्वरसाइड का उपयोग कर रहे हैं, तो HTML एन्कोडिंग / डिकोडिंग के लिए लाइब्रेरी का उपयोग करने से आपको एक एकल समाधान मिलता है जो क्लाइंटसाइड और सर्वरसाइड दोनों को काम करता है।
कुछ ब्राउज़रों की इकाई डिकोडिंग एल्गोरिदम में कीड़े हैं या कुछ नामित चरित्र संदर्भों के लिए समर्थन गायब है । उदाहरण के लिए, इंटरनेट एक्सप्लोरर गैर-ब्रेकिंग स्पेस (
) को सही ढंग से डिकोड और रेंडर करेगा, लेकिन डोम तत्व की innerText
संपत्ति के माध्यम से गैर-ब्रेकिंग वाले के बजाय साधारण स्थान के रूप में रिपोर्ट करें , <textarea>
हैक को तोड़ना (केवल मामूली रूप से)। इसके अतिरिक्त, IE 8 और 9 केवल HTML 5 में जोड़े गए नए नामित चरित्र संदर्भों में से किसी का भी समर्थन नहीं करते हैं । वह लेखक ने http://mathias.html5.org/tests/html पर नामित चरित्र संदर्भ समर्थन का परीक्षण भी होस्ट करता है / नामित-चरित्र-संदर्भ / । IE 8 में, यह एक हजार से अधिक त्रुटियों की रिपोर्ट करता है।
यदि आप निकाय डिकोडिंग से संबंधित ब्राउज़र बग्स से अछूता रहना चाहते हैं और / या नामित चरित्र संदर्भों की पूरी श्रृंखला को संभालने में सक्षम हैं, तो आप <textarea>
हैक से दूर नहीं हो सकते ; आप की तरह एक पुस्तकालय की आवश्यकता होगी वह ।
वह बस अच्छी तरह से महसूस करता है कि इस तरह से काम करना कम है।
एनकोड:
$("<textarea/>").html('<a>').html(); // return '<a>'
डिकोड:
$("<textarea/>").html('<a>').val() // return '<a>'
उपयोग
myString = myString.replace( /\&/g, '&' );
सर्वर साइड पर इसे करना सबसे आसान है क्योंकि जाहिरा तौर पर जावास्क्रिप्ट के पास संस्थाओं को संभालने के लिए कोई मूल पुस्तकालय नहीं है, और न ही मैं जावास्क्रिप्ट का विस्तार करने वाले विभिन्न चौखटे के लिए खोज परिणामों में सबसे ऊपर पाया गया।
"जावास्क्रिप्ट एचटीएमएल इकाइयाँ" के लिए खोज करें, और हो सकता है कि आपको उस उद्देश्य के लिए कुछ पुस्तकालय मिलें, लेकिन वे संभवतः उपरोक्त तर्क के अनुसार बनाए जाएंगे - प्रतिस्थापित करें, इकाई द्वारा इकाई।
मेरे पास बस HTML बटन के लिए एक मान के रूप में एक HTML इकाई charater (as) होना चाहिए। ब्राउज़र में शुरुआत से ही HTML कोड अच्छा लगता है:
<input type="button" value="Embed & Share ⇓" id="share_button" />
अब मैं एक टॉगल जोड़ रहा था जिसे चारित्र भी प्रदर्शित करना चाहिए। यह मेरा समाधान है
$("#share_button").toggle(
function(){
$("#share").slideDown();
$(this).attr("value", "Embed & Share " + $("<div>").html("⇑").text());
}
यह बटन में फिर से in प्रदर्शित करता है। मुझे उम्मीद है कि यह किसी की मदद कर सकता है।
"Embed & Share \u21d1"
), या बेहतर अभी तक उपयोग करना होगा "Embed & Share ⇑"
। एक HTML एंटिटी को पार्स करने के लिए एक DOM एलिमेंट का उपयोग करके एक जावास्क्रिप्ट स्ट्रिंग में एक मनमाना यूनिकोड कैरेक्टर सेंकना एक चालाक और रचनात्मक दृष्टिकोण है जो रुब गोल्डबर्ग को गर्व होगा, लेकिन अच्छा अभ्यास नहीं है; यूनिकोड एस्केप भाषा में विशेष रूप से इस उपयोग के मामले को संभालने के लिए है।
आपको HTML संस्थाओं के लिए कस्टम फंक्शन बनाना है:
function htmlEntities(str) {
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g,'>').replace(/"/g, '"');
}
मान लें कि आपके पास स्ट्रिंग के नीचे है।
हमारे डीलक्स केबिन गर्म, आरामदायक और amp हैं; आरामदायक
var str = $("p").text(); // get the text from <p> tag
$('p').html(str).text(); // Now,decode html entities in your variable i.e
str और वापस असाइन करें
टैग।
बस।
ExtJS उपयोगकर्ताओं के लिए, यदि आपके पास पहले से ही एन्कोडेड स्ट्रिंग है, उदाहरण के लिए जब लाइब्रेरी फ़ंक्शन का लौटाया गया मान इनर HTML सामग्री है, तो इस एक्सटीजेएस फ़ंक्शन पर विचार करें:
Ext.util.Format.htmlDecode(innerHtmlContent)
स्ट्रिंग क्लास बढ़ाएँ:
String::decode = ->
$('<textarea />').html(this).text()
और विधि के रूप में उपयोग करें:
"<img src='myimage.jpg'>".decode()
इसे इस्तेमाल करे :
var htmlEntities = "<script>alert('hello');</script>";
var htmlDecode =$.parseHTML(htmlEntities)[0]['wholeText'];
console.log(htmlDecode);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
parseHTML , Jquery लाइब्रेरी में एक फंक्शन है और यह एक ऐरे को लौटाएगा जिसमें दिए गए स्ट्रिंग के बारे में कुछ विवरण शामिल हैं।
कुछ मामलों में स्ट्रिंग बड़ा हो रहा है, इसलिए फ़ंक्शन सामग्री को कई अनुक्रमितों से अलग करेगा।
और सभी इंडेक्स डेटा प्राप्त करने के लिए आपको किसी भी इंडेक्स पर जाना चाहिए, फिर "पूरे टेक्स्ट" नामक इंडेक्स तक पहुंचें।
मैंने इंडेक्स 0 चुना क्योंकि यह सभी मामलों (छोटे स्ट्रिंग या बड़े स्ट्रिंग) में काम करेगा।
यहां अभी भी एक समस्या है: इनपुट मान को असाइन किए जाने पर बच गया स्ट्रिंग पठनीय नहीं दिखता है
var string = _.escape("<img src=fake onerror=alert('boo!')>");
$('input').val(string);
निर्गमन: https://jsfiddle.net/kjpdwmqa/3/
escape
अंडरस्कोर.जेएस की विधि का उपयोग कर रहे हैं । इसके अलावा कोई स्पष्टीकरण नहीं है कि आपके कोड नमूने को ओपी की समस्या को कैसे हल करना चाहिए।
वैकल्पिक रूप से, इसके लिए एक पुस्तकालय भी है।
यहाँ, https://cdnjs.com/lbooks/he
npm install he //using node.js
<script src="js/he.js"></script> //or from your javascript directory
उपयोग निम्नानुसार है ...
//to encode text
he.encode('© Ande & Nonso® Company LImited 2018');
//to decode the
he.decode('© Ande & Nonso® Company Limited 2018');
खुश होती है।
JQuery के साथ HTML संस्थाओं को डिकोड करने के लिए, बस इस फ़ंक्शन का उपयोग करें:
function html_entity_decode(txt){
var randomID = Math.floor((Math.random()*100000)+1);
$('body').append('<div id="random'+randomID+'"></div>');
$('#random'+randomID).html(txt);
var entity_decoded = $('#random'+randomID).html();
$('#random'+randomID).remove();
return entity_decoded;
}
कैसे इस्तेमाल करे:
जावास्क्रिप्ट:
var txtEncoded = "á é í ó ú";
$('#some-id').val(html_entity_decode(txtEncoded));
HTML:
<input id="some-id" type="text" />
सबसे आसान तरीका है अपने तत्वों के लिए एक वर्ग चयनकर्ता सेट करें फिर निम्नलिखित कोड का उपयोग करें:
$(function(){
$('.classSelector').each(function(a, b){
$(b).html($(b).text());
});
});
और कुछ नहीं चाहिए!
मुझे यह समस्या थी और यह स्पष्ट समाधान मिला और यह ठीक काम करता है।