আমি কি জাভাস্ক্রিপ্টে এইচটিএমএল বিশেষ অক্ষরগুলি এড়াতে পারি?


201

আমি জাভাস্ক্রিপ্ট ফাংশন দ্বারা এইচটিএমএলে একটি পাঠ্য প্রদর্শন করতে চাই। আমি কীভাবে জেএসএসে এইচটিএমএল বিশেষ অক্ষরগুলি থেকে বাঁচতে পারি? একটি এপিআই আছে?


11
এটি কোনও সদৃশ নয়, যেহেতু এই প্রশ্নটি jQuery সম্পর্কে জিজ্ঞাসা করে না। আমি কেবলমাত্র
এটির জন্যই

উত্তর:


330
function escapeHtml(unsafe) {
    return unsafe
         .replace(/&/g, "&")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
 }

11
কেন "& # 039;" এবং "& apos" নয় ?
সেরেদা


2
আমি মনে করি replace()কলগুলিতে নিয়মিত প্রকাশগুলি অপ্রয়োজনীয়। সরল পুরানো একক-চরিত্রের স্ট্রিংগুলি পাশাপাশি করবে।
জামিক্স

22
@ জ্যামিক্স আপনি কাঁচা স্ট্রিং সহ বিশ্বব্যাপী প্রতিস্থাপন করতে পারবেন না, যখন আধুনিক ব্রাউজার ইঞ্জিনগুলি সাধারণ নিয়মিত অভিব্যক্তিটি বেশ ভাল করে তোলে।
বজরেন্ড

5
কোনও স্ট্যান্ডার্ড এপিআই আছে বা এটিই একমাত্র উপায়?
সুনীল গার্গ

55

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='&lt;b&gt;cool&lt;/b&gt;'>


এখানে কাজ করছে তবে ব্রাউজারে অফলাইনে আমার পক্ষে কাজ করছে না

48

আপনি jQuery এর .text()ফাংশন ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

http://jsfiddle.net/9H6Ch/

.text()ফাংশন সম্পর্কিত jQuery ডকুমেন্টেশন থেকে :

আমাদের সচেতন হওয়া দরকার যে এই পদ্ধতিটি প্রয়োজনীয়ভাবে সরবরাহ করা স্ট্রিংটি এড়িয়ে যায় যাতে এটি HTML এ সঠিকভাবে রেন্ডার হয়। এটি করতে, এটি ডম পদ্ধতিতে .createTextNode () কল করে, স্ট্রিংটিকে এইচটিএমএল হিসাবে ব্যাখ্যা করে না।

JQuery ডকুমেন্টেশনের পূর্ববর্তী সংস্করণগুলি এটিকে এটি উচ্চারণ করেছে ( জোর দেওয়া হয়েছে ):

আমাদের সচেতন হওয়া দরকার যে এই পদ্ধতিটি প্রয়োজনীয়ভাবে সরবরাহ করা স্ট্রিংটি এড়িয়ে যায় যাতে এটি HTML এ সঠিকভাবে রেন্ডার হয়। এটি করার জন্য, এটি ডম পদ্ধতিতে .createTextNode () কল করে, যা তাদের বিশেষ অক্ষরের পরিবর্তে তাদের এইচটিএমএল সত্তা সমতুল্য (যেমন & lt; <) এর সাথে প্রতিস্থাপন করে


3
আপনি যদি এটি কেবল এই জাতীয় রূপান্তর করতে চান তবে আপনি এটি একটি তাজা উপাদানের উপরও ব্যবহার করতে পারেন: const str = "foo<>'\"&"; $('<div>').text(str).html()ফলনfoo&lt;&gt;'"&amp;
amoebe

28

আমি মনে করি এটি করার উপযুক্ত উপায়টি আমি খুঁজে পেয়েছি ...

// 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);

আমি আজ এইচটিএমএল সম্পর্কে নতুন কিছু শিখেছি। w3schools.com/jsref/met_docament_createtextnode.asp
সেলোরিও

1
আপনি যদি document.createTextNode("<script>alert('Attack!')</script>").textContent
এইভাবে

আপনি যে কাজটি করছেন তা পাঠ্য নির্ধারণ করে দিলে এটিই সঠিক উপায়। এটি টেক্সট কনটেন্ট তবে দৃশ্যত এটি ভাল সমর্থন করে না। এটি কোনও কাজ করবে না যদি আপনি কিছু এইচটিএমএল কিছু অংশের পাঠ্য দিয়ে স্ট্রিং তৈরি করে থাকেন তবে আপনাকে এখনও পালাতে হবে।
jgmjgm


20

এটি এখন পর্যন্ত, আমি এটি সম্পন্ন করে দেখানোর দ্রুততম উপায়। এছাড়াও, এটি পৃষ্ঠায় উপাদানগুলি যুক্ত, অপসারণ বা পরিবর্তন না করে এগুলি করে।

function escapeHTML(unsafeText) {
    let div = document.createElement('div');
    div.innerText = unsafeText;
    return div.innerHTML;
}

7
সতর্কতা: এটি উদ্ধৃতিগুলি এড়ায় না তাই আপনি HTML কোডে অ্যাট্রিবিউট মানগুলির আউটপুট ব্যবহার করতে পারবেন না। উদাহরণস্বরূপ var divCode = '<div data-title="' + escapeHTML('Jerry "Bull" Winston') + '">Div content</div>'অবৈধ এইচটিএমএল আসবে!
izogfif

17

আরও ভাল সমাধানটি খুঁজে পাওয়া আকর্ষণীয় ছিল:

var escapeHTML = function(unsafe) {
  return unsafe.replace(/[&<"']/g, function(m) {
    switch (m) {
      case '&':
        return '&amp;';
      case '<':
        return '&lt;';
      case '"':
        return '&quot;';
      default:
        return '&#039;';
    }
  });
};

আমি বিশ্লেষণ করব না >কারণ এটি ফলাফলে এক্সএমএল / এইচটিএমএল কোডটি ভঙ্গ করে না।

এখানে মানদণ্ডগুলি রয়েছে: http://jsperf.com/regexpairs এছাড়াও, আমি একটি সর্বজনীন escapeফাংশন তৈরি করেছি : http://jsperf.com/regexpairs2


1
এটি দেখতে আকর্ষণীয় যে স্যুইচটি ব্যবহার করা মানচিত্রের চেয়ে উল্লেখযোগ্যভাবে দ্রুত। আমি এটা আশা করিনি! ভাগ করে নেওয়ার জন্য ধন্যবাদ!
পিটার টি।

আপনি যতটা সম্ভব কোড এবং অ্যাকাউন্টে নিতে পারেন তার চেয়ে অনেক বেশি ইউনিকোড অক্ষর রয়েছে। আমি এই ম্যানুয়াল পদ্ধতিটি মোটেই সুপারিশ করব না।
vsync

আপনি কেন মোটেও বহু-বাইট চরিত্রগুলি এড়িয়ে যাবেন? সর্বত্র ইউটিএফ -8 ব্যবহার করুন।
নিওনিত

4
স্কিপিং> সম্ভাব্যভাবে কোড ভঙ্গ করতে পারে। আপনাকে অবশ্যই মনে রাখতে হবে যে <> এর ভিতরে থাকাটিও এইচটিএমএল। সেক্ষেত্রে স্কিপিং> ব্রেক হয়ে যাবে। আপনি যদি কেবল ট্যাগগুলির মধ্যেই পলায়ন করেন তবে আপনার কেবল পলাত্ব প্রয়োজন <এবং &।
jgmjgm

8

আনঙ্কডবিহীন পাঠ্য প্রদর্শনের সর্বাধিক সংক্ষিপ্ত এবং পারফরম্যান্ট উপায় হ'ল textContentসম্পত্তি ব্যবহার করা ।

ব্যবহারের চেয়ে দ্রুতinnerHTML । এবং এটি অ্যাকাউন্টে ওভারহেড এড়ানো ছাড়াই।

document.body.textContent = 'a <b> c </b>';


@ জেডজমোম্বো, এটি সম্পূর্ণ স্বাভাবিক যে এটি স্টাইল এবং স্ক্রিপ্ট ট্যাগগুলির সাথে কাজ করে না। আপনি যখন তাদের লিখিত সামগ্রী যুক্ত করবেন, আপনি কোড যুক্ত করুন, পাঠ্য নয় , এই ক্ষেত্রে অভ্যন্তরীণ এইচটিএমএল ব্যবহার করুন। তদুপরি, আপনার এড়াতে হবে না, এটি দুটি বিশেষ ট্যাগ যা এইচটিএমএল হিসাবে পার্স করা হয় না। বিশ্লেষণ করার সময়, সমাপনী ক্রমটি </পূরণ না হওয়া অবধি তাদের সামগ্রীটিকে পাঠ্য হিসাবে বিবেচনা করা হবে ।
ব্যবহারকারী

6

ডোম উপাদানগুলি ইনটারনেক্সটকে বরাদ্দ করে পাঠ্যকে এইচটিএমএল রূপান্তর করতে সহায়তা করে । ইনারটেক্সট কোনও ফাংশন নয় তবে এটাকে নির্ধারণ করা এমনভাবে কাজ করে যেন পাঠ্যটি এড়িয়ে যায়।

document.querySelectorAll('#id')[0].innerText = 'unsafe " String >><>';

1
কমপক্ষে ক্রোমটিতে মাল্টলাইন পাঠ্য নির্ধারণের <br>সময় নতুন লাইনের জায়গায় উপাদান যুক্ত করা হয় যা স্টাইল বা স্ক্রিপ্টগুলির মতো নির্দিষ্ট উপাদানগুলিকে ভেঙে ফেলতে পারে। createTextNodeএই সমস্যার প্রবণ নয়।
ZzZombo

1
innerTextকিছু উত্তরাধিকার / নির্দিষ্ট সমস্যা আছে। ব্যবহার করা ভাল textContent
রায় টিঙ্কার

3

আপনি আপনার স্ট্রিংয়ের প্রতিটি অক্ষরকে এনকোড করতে পারেন:

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

অথবা (এবং, অবিচ্ছিন্ন, <,>, "এবং ') এর মতো সম্পর্কে উদ্বিগ্ন হওয়ার জন্য প্রধান চরিত্রগুলিকে লক্ষ্য করুন:

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 &ampersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55">&#119;&#119;&#119;&#46;&#87;&#72;&#65;&#75;&#46;&#99;&#111;&#109;</textarea>


আপনার নিজের পালানোর ফাংশনটি লেখার পক্ষে সাধারণত একটি খারাপ ধারণা। অন্যান্য উত্তর এই ক্ষেত্রে ভাল।
জান্নিস

2

একটি ওয়ান-লাইনার (ES6 + এর জন্য):

var escapeHtml = s => (s + '').replace(/[&<>"']/g, m => ({
    '&': '&amp;', '<': '&lt;', '>': '&gt;',
    '"': '&quot;', "'": '&#39;'
})[m]);

পুরানো সংস্করণগুলির জন্য:

function escapeHtml(s) {
    return (s + '').replace(/[&<>"']/g, function (m) {
        return ({
            '&': '&amp;', '<': '&lt;', '>': '&gt;',
            '"': '&quot;', "'": '&#39;'
        })[m];
    });
}

0

একটি ডিওএম কাঠামো তৈরি করার সময় এই সমস্যাটি এসেছিল। এই প্রশ্নটি আমাকে এটি সমাধানে সহায়তা করেছে। আমি একটি পথ বিভাজক হিসাবে একটি ডাবল শেভ্রন ব্যবহার করতে চেয়েছিলাম, তবে একটি নতুন পাঠ্য নোড সংযুক্ত করার ফলে চরিত্রের পরিবর্তে পালিয়ে যাওয়া চরিত্রের কোডটি প্রদর্শিত হয়েছিল:

var _div = document.createElement('div');
var _separator = document.createTextNode('&raquo;');
//_div.appendChild(_separator); /* this resulted in '&raquo;' being displayed */
_div.innerHTML = _separator.textContent; /* this was key */

0

আপনি যদি ইতিমধ্যে আপনার অ্যাপ্লিকেশনটিতে মডিউল ব্যবহার করেন তবে আপনি এসেসেপ-এইচটিএমএল মডিউলটি ব্যবহার করতে পারেন ।

import escapeHtml from 'escape-html';
const unsafeString = '<script>alert("XSS");</script>';
const safeString = escapeHtml(unsafeString);


-4

আমি এই সমাধান নিয়ে এসেছি।

আসুন ধরে নেওয়া যাক আমরা ব্যবহারকারী বা ডাটাবেস থেকে অনিরাপদ ডেটা সহ উপাদানটিতে কিছু এইচটিএমএল যুক্ত করতে চাই।

var unsafe = 'some unsafe data like <script>alert("oops");</script> here';

var html = '';
html += '<div>';
html += '<p>' + unsafe + '</p>';
html += '</div>';

element.html(html);

এটি এক্সএসএস আক্রমণগুলির বিরুদ্ধে অনিরাপদ। এবার এটি যুক্ত করুন।

$(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()এটি ব্যবহারের চেয়ে অনেক সহজ এবং এটি সরিয়ে ফেলবে !!! সমস্ত সম্ভাব্য এইচটিএমএল ট্যাগ (আমি আশা করি)।


এটি বিপজ্জনক ধারণা, এটি অনিরাপদ এইচটিএমএল স্ট্রিংকে এইচটিএমএল হিসাবে পার্স করে, যদি উপাদানটি ডিওএমের সাথে সংযুক্ত থাকে তবে এটি বাদ দেবে। পরিবর্তে .innerText ব্যবহার করুন।
টেকনোপল

এটি নিরাপদ নয়। এটি রূপান্তরিত &lt;script&gt;হয় <script>
fgb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.