मैं जावास्क्रिप्ट फ़ंक्शन द्वारा HTML को एक पाठ प्रदर्शित करना चाहता हूं। मैं जेएस में HTML विशेष वर्ण कैसे बच सकता हूं? क्या कोई एपीआई है?
मैं जावास्क्रिप्ट फ़ंक्शन द्वारा HTML को एक पाठ प्रदर्शित करना चाहता हूं। मैं जेएस में HTML विशेष वर्ण कैसे बच सकता हूं? क्या कोई एपीआई है?
जवाबों:
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
replace()कॉल में नियमित अभिव्यक्ति अनावश्यक हैं। सादा पुराने एकल चरित्र तार बस के रूप में अच्छी तरह से करना होगा।
function escapeHtml(html){
var text = document.createTextNode(html);
var p = document.createElement('p');
p.appendChild(text);
return p.innerHTML;
}
// Escape while typing & print result
document.querySelector('input').addEventListener('input', e => {
console.clear();
console.log( escapeHtml(e.target.value) );
});
<input style='width:90%; padding:6px;' placeholder='<b>cool</b>'>
आप jQuery के .text()फ़ंक्शन का उपयोग कर सकते हैं ।
उदाहरण के लिए:
.text()फ़ंक्शन के संबंध में jQuery के दस्तावेज़ से :
हमें यह जानने की आवश्यकता है कि यह विधि आवश्यक रूप से प्रदान की गई स्ट्रिंग से बच जाती है ताकि यह HTML में सही ढंग से प्रस्तुत हो। ऐसा करने के लिए, यह DOM विधि .createTextNode () कहता है, स्ट्रिंग को HTML के रूप में व्याख्या नहीं करता है।
JQuery के प्रलेखन के पिछले संस्करणों ने इसे इस तरह से शब्द दिया ( जोर दिया ):
हमें यह जानने की आवश्यकता है कि यह विधि आवश्यक रूप से प्रदान की गई स्ट्रिंग से बच जाती है ताकि यह HTML में सही ढंग से प्रस्तुत हो। ऐसा करने के लिए, यह DOM विधि .createTextNode () को कॉल करता है, जो विशेष अक्षर को उनके HTML इकाई समकक्षों (जैसे & lt; <के लिए; ) से प्रतिस्थापित करता है।
const str = "foo<>'\"&"; $('<div>').text(str).html()पैदावारfoo<>'"&
मुझे लगता है कि मुझे इसे करने का उचित तरीका मिला ...
// Create a DOM Text node:
var text_node = document.createTextNode(unescaped_text);
// Get the HTML element where you want to insert the text into:
var elem = document.getElementById('msg_span');
// Optional: clear its old contents
//elem.innerHTML = '';
// Append the text node into it:
elem.appendChild(text_node);
document.createTextNode("<script>alert('Attack!')</script>").textContent
लॉश का उपयोग करना
_.escape('fred, barney, & pebbles');
// => 'fred, barney, & pebbles'
यह, अब तक, सबसे तेज़ तरीका मैंने इसे किया है। साथ ही, यह पेज पर तत्वों को जोड़ने, हटाने या बदलने के बिना करता है।
function escapeHTML(unsafeText) {
let div = document.createElement('div');
div.innerText = unsafeText;
return div.innerHTML;
}
var divCode = '<div data-title="' + escapeHTML('Jerry "Bull" Winston') + '">Div content</div>'अवैध HTML निकलेगा!
एक बेहतर समाधान खोजना दिलचस्प था:
var escapeHTML = function(unsafe) {
return unsafe.replace(/[&<"']/g, function(m) {
switch (m) {
case '&':
return '&';
case '<':
return '<';
case '"':
return '"';
default:
return ''';
}
});
};
मैं पार्स नहीं >करता हूं क्योंकि यह परिणाम में XML / HTML कोड को नहीं तोड़ता है।
यहाँ बेंचमार्क हैं: http://jsperf.com/regexpairs
इसके अलावा, मैंने एक सार्वभौमिक escapeफ़ंक्शन बनाया : http://jsperf.com/regexpairs2
अनएन्कोडेड टेक्स्ट को प्रदर्शित करने के लिए सबसे संक्षिप्त और निष्पादित तरीका उपयोग करना है textContent संपत्ति है।
उपयोग करने की तुलना में तेज़innerHTML । और वह ओवरहेड से बचने के लिए ध्यान में रखे बिना है।
document.body.textContent = 'a <b> c </b>';
</पूरा नहीं हो जाता।
डोम एलिमेंट्स इनर टेक्स्ट को असाइन करके टेक्स्ट को HTML में बदलने का समर्थन करते हैं । इनर टेक्स्ट एक फ़ंक्शन नहीं है, लेकिन इसे असाइन करने से यह काम करता है जैसे कि टेक्स्ट बच गए थे।
document.querySelectorAll('#id')[0].innerText = 'unsafe " String >><>';
<br>से नईलाइन्स के स्थान पर एलिमेंट्स जुड़ते हैं, जो कुछ तत्वों को तोड़ सकते हैं, जैसे स्टाइल या स्क्रिप्ट। createTextNodeइस समस्या से ग्रस्त नहीं है।
innerTextकुछ विरासत / कल्पना मुद्दे हैं। उपयोग करने के लिए बेहतर है textContent।
आप अपने स्ट्रिंग में हर कैरेक्टर को एनकोड कर सकते हैं:
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
या जैसे (, inebreaks, <,>, "और ') के बारे में चिंता करने के लिए मुख्य पात्रों को लक्षित करें:
function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}
test.value=encode('How to encode\nonly html tags &<>\'" nice & fast!');
/*************
* \x26 is &ersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55">www.WHAK.com</textarea>
एक-लाइनर (ES6 + के लिए):
var escapeHtml = s => (s + '').replace(/[&<>"']/g, m => ({
'&': '&', '<': '<', '>': '>',
'"': '"', "'": '''
})[m]);
पुराने संस्करणों के लिए:
function escapeHtml(s) {
return (s + '').replace(/[&<>"']/g, function (m) {
return ({
'&': '&', '<': '<', '>': '>',
'"': '"', "'": '''
})[m];
});
}
डोम संरचना बनाते समय इस मुद्दे पर आया था। इस प्रश्न ने मुझे इसे हल करने में मदद की। मैं एक पथ विभाजक के रूप में एक डबल शेवरॉन का उपयोग करना चाहता था, लेकिन एक नए पाठ नोड को सीधे जोड़ने से चरित्र के बजाय बचा हुआ चरित्र कोड दिखाई दे रहा था:
var _div = document.createElement('div');
var _separator = document.createTextNode('»');
//_div.appendChild(_separator); /* this resulted in '»' being displayed */
_div.innerHTML = _separator.textContent; /* this was key */
यदि आप पहले से ही अपने ऐप में मॉड्यूल का उपयोग करते हैं, तो आप एस्केप-html मॉड्यूल का उपयोग कर सकते हैं ।
import escapeHtml from 'escape-html';
const unsafeString = '<script>alert("XSS");</script>';
const safeString = escapeHtml(unsafeString);
मैं इस समाधान के साथ आया था।
मान लेते हैं कि हम उपयोगकर्ता या डेटाबेस से असुरक्षित डेटा के साथ तत्व में कुछ html जोड़ना चाहते हैं।
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + unsafe + '</p>';
html += '</div>';
element.html(html);
यह XSS हमलों के खिलाफ असुरक्षित है। अब इसे जोड़ें।
$(document.createElement('div')).html(unsafe).text();
इसलिए यह
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + $(document.createElement('div')).html(unsafe).text(); + '</p>';
html += '</div>';
element.html(html);
मेरे लिए यह प्रयोग करने की तुलना में बहुत आसान है .replace()और इसे हटा देगा !!! सभी संभव html टैग (मुझे आशा है)।
<script>में <script>।