1

私のアプリ(開発中)は、Safari 4.0.3とJavaScriptを使用して、フロントエンドをユーザーに提示します。バックエンドはPHPとSQLiteです。これはOSX10.5.8の下にあります。

アプリは、ユーザーに提示するHTMLのチャンクを時々受信します。各チャンクは受信した電子メールの本文であるため、受信したHTMLの品質を制御することはできません。私がやっていることは、innerHTMLを使用してチャンクをiFrameに押し込み、Safariにレンダリングさせます。

それを行うために私はこれを行います:

window.frames["mainwindow"].window.frames["Frame1"].document.body.innerHTML = myvar;

myvarには、受信したHTMLが含まれています。現在、ほとんどの場合、これは希望どおりに機能し、HTMLは期待どおりにレンダリングされます。例外は、チャンクのタグが次のようになっている場合のようです。

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" ...

2800文字以上の場合も同様です。その効果は、上記のJavaScriptステートメントが実行されていないかのようです。[開発]メニューのSafariのエラーコンソールを使用してiFrameを調べていることがわかります。SQLiteバックエンドデータベースからHTMLを抽出し、それを.htmlファイルとして保存すると、Safariは問題なくそれをレンダリングします。

なぜこれが起こっているのか、innerHTMLのそのような使用、または同じことについての議論へのポインタについてのコメントをいただければ幸いです。

4

1 に答える 1

2

innerHTML完全な文書を書くことと同じではありません。ガンボが提案するように書いてもouterHTML、doctypes など、ルート要素の外側に混乱を招く可能性があるものがあります。ドキュメント全体を一度に書き込むには、昔ながらのクロスフレーム document.write を使用する必要があります。

var d= window.frames["mainwindow"].window.frames["Frame1"].document;
d.open();
d.write(htmldoc);
d.close();

各チャンクは受信した電子メールの本文であり、受信した HTML の品質を制御することはできません。

OK、セキュリティ上の問題があるかもしれません。

電子メールのような信頼できないソースに HTML をセキュリティ コンテキストに挿入させた場合 (そして、書き込み先の iframe がセキュリティコンテキスト内にある場合)、独自の JavaScript を実行できます。同じホスト名でアプリケーションと他のものを囲みます。あなたのアプリケーションがそれを気にしないほど些細なことでない限り、これは本当に悪いニュースです。

信頼できない HTML を許可する必要がある場合、多くの Web メール サービスでは、アプリケーションの他の部分にアクセスできない別のホスト名 (サブドメインなど) でサービスを提供します。これを行うには、iframe src が別のホスト名を指す必要があります。2 つのセキュリティ コンテキスト間でスクリプトを作成することはできませんでした。

于 2009-09-24T14:38:07.347 に答える