私はjavascriptを使用してXMLからHTMLページを生成しています(XMLファイルからテーブルを生成します)。まあ、ある種のXML構造などがあります。次のようにHTMLコードを記述します
document.write("<span>" + name + "</span>");
次のように変数を取得します
name = x[i].getElementsByTagName("NAME")[0].childNodes[0].nodeValue;
したがって、変数名には、XML ファイル構造内のノードNAMEが含まれており、デモ用の単純な XML が含まれています。
<FILE>
<NAME>file 1.2.3</NAME>
<SIZE>1Kb</SIZE>
</FILE>
XML ファイルはユーザーによって編集されているため、ユーザーは好きなものを挿入できます。ユーザーが次のように入力する<script>alert(1);</script>
と、NAME ノードに JavaScript が通常の HTML を出力し、ブラウザが「alert(1)」を呼び出します。それは私が起こりたくないことです。
すべての編集は「my」フロントエンドで行われ、php 関数 htmlspecialchars(); を介して行われます。したがって、実際にユーザーが NAME ノードに保存するのは「エンコードされた」HTML です。
<script>alert(3);</script>
それだけでは十分ではありませんが、XML がエンコードされた HTML タグで保存されると、javascript はそれらを通常のタグとして出力します。
言い換えれば、次のテキストに続く JS (document.write) を使用してページに書き込む方法、<?php $=1; ?>
または<htmltag>whatever is here </htmltag>
実際の HTML を破損することなくページに書き込むにはどうすればよいでしょうか。
解決策はありますか?
たとえば、これは期待どおりに機能しません。
document.write("<span class=\"edit\"><script>alert(3);</script></span>");
解決
Web でこの関数を見つけました
function htmlspecialchars(str) {
if (typeof(str) == "string") {
str = str.replace(/&/g, "&"); /* must do & first */
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
}
return str;
}
それは仕事をしますが、その理由はよくわかりません。
XML ファイルでは、既に「エンコード」されているか、安全にレンダリングできる形式になっています (document.write 関数に送信)。「htmlspecialchars」をもう一度実行するだけで、かなりうまく機能します。
document.write("<span>" + htmlspecialchars(name) + "</span>");