JavaScript機能でHTMLにテキストを表示したい。JSでHTML特殊文字をエスケープするにはどうすればよいですか?APIはありますか?
JavaScript機能でHTMLにテキストを表示したい。JSでHTML特殊文字をエスケープするにはどうすればよいですか?APIはありますか?
回答:
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
replace()呼び出しでの正規表現は不要だと思います。プレーンな古い1文字の文字列も同様に機能します。
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; for <など)に置き換えます。
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
これは、私が見た中で最速の方法です。さらに、ページの要素を追加、削除、または変更せずにすべてを実行します。
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>';
</が満たされるまで、それらのコンテンツはテキストとして扱われます。
DOM要素はinnerTextに割り当てることでテキストをHTMLに変換することをサポートします。innerTextは関数ではありませんが、それに割り当てると、テキストがエスケープされたかのように機能します。
document.querySelectorAll('#id')[0].innerText = 'unsafe " String >><>';
<br>、改行の代わりに要素が追加され、スタイルやスクリプトなどの特定の要素が壊れる可能性があります。createTextNodeこの問題になりやすいではありません。
innerTextいくつかのレガシー/仕様の問題があります。使用する方が良いtextContent。
文字列のすべての文字をエンコードできます。
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
または、次のように、心配するメインキャラクター(&、inebreak、<、>、 "、 ')をターゲットにします。
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];
});
}
DOM構造を構築するときにこの問題に遭遇しました。この質問は私がそれを解決するのに役立ちました。パスの区切り記号としてダブルシェブロンを使用したかったのですが、新しいテキストノードを直接追加すると、文字自体ではなく、エスケープされた文字コードが表示されました。
var _div = document.createElement('div');
var _separator = document.createTextNode('»');
//_div.appendChild(_separator); /* this resulted in '»' being displayed */
_div.innerHTML = _separator.textContent; /* this was key */
アプリですでにモジュールを使用している場合は、escape-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>ます。