0

私は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 です。

&lt;script&gt;alert(3);&lt;/script&gt;

それだけでは十分ではありませんが、XML がエンコードされた HTML タグで保存されると、javascript はそれらを通常のタグとして出力します。

言い換えれば、次のテキストに続く JS (document.write) を使用してページに書き込む方法、<?php $=1; ?>または<htmltag>whatever is here </htmltag>実際の HTML を破損することなくページに書き込むにはどうすればよいでしょうか。

解決策はありますか?

たとえば、これは期待どおりに機能しません。

document.write("<span class=\"edit\">&lt;script&gt;alert(3);&lt;/script&gt;</span>");

解決

Web でこの関数を見つけました

function htmlspecialchars(str) {
 if (typeof(str) == "string") {
  str = str.replace(/&/g, "&amp;"); /* must do &amp; first */
  str = str.replace(/"/g, "&quot;");
  str = str.replace(/'/g, "&#039;");
  str = str.replace(/</g, "&lt;");
  str = str.replace(/>/g, "&gt;");
 }
return str;
}

それは仕事をしますが、その理由はよくわかりません。

XML ファイルでは、既に「エンコード」されているか、安全にレンダリングできる形式になっています (document.write 関数に送信)。「htmlspecialchars」をもう一度実行するだけで、かなりうまく機能します。

document.write("<span>" + htmlspecialchars(name) + "</span>");
4

1 に答える 1

0

「一重引用符」を使用しようとしましたか?:

document.write('<span class="edit">' + name + '</span>');

動的要素を作成し、これらの要素を JavaScript で再度使用する場合は、DOM 関数 (createElement、createTextNode、createAttribute) を使用する必要があります。

http://reference.sitepoint.com/javascript/Document/createElement

于 2013-02-03T18:24:25.160 に答える