2011-06-26 1 views
6

私はいくつかのJS/HTML/CSSをやっています。見て回ると、バックエンド(例えばAjaxレスポンス)からHTMLを返し、直接(それを要素のinnerHTMLに割り当てるなどして)表示するのは珍しいことではないようです。たとえば、jQueryのload()メソッドは基本的にこれを行うためのショートカットと考えています。AjaxレスポンスのHTMLを直接返すのが避けられますか?

私はいくつかの理由で私を心配していますが、私はこれらの分野のアプローチやイディオムに精通していないと確信していません。懸念具体的には、私の懸念事項は次のとおりです。

1)要素にHTMLを直接割り当てることは安全ではないようです。少なくとも、ユーザーコンテンツ(または第三者コンテンツ)の可能性がある場合は、少なくとも危険です。

2)プレゼンテーション情報(HTML)を直接送信すると、プレゼンテーション/モデルミキシングが発生する可能性があります。もちろん、これらをバックエンドできれいに分離してHTMLを返すことは可能ですが、私が見てきたいくつかのプロジェクトではこれは当てはまりません。

私の質問は、HTMLをAjaxアプリケーションで正当なHTTPレスポンスの形式に戻すことですか、それとも避けるのが最善でしょうか?

答えて

1

正直言ってユースケースによると思います。いくつかのJSONまたはXMLデータに基づいて多くのHTMLを構築する必要がある場合、クライアントに支払われるペナルティはかなり重いです。

個人的に私は両者の混合物を使用します。ちょっとしたデータ(整数または小文字の文字列)の場合は、JSONまたは生データだけを使用します。

クライアントサイドでフォーマットする必要がある複雑なデータセット(ユーザーのコメントなど)があれば、htmlを送信してクライアントに保存します。

個人的に私はセキュリティについては心配しません。少なくとも、悪意のあるHTMLを注入するユーザーはいないでしょう。とにかくそれが提出されたらそれを扱うべきです。

編集:これには例外があります。帯域幅が懸念されている場合(モバイルウェブなど)、ほとんどのデータをワイヤで送信することは、ほとんど常に最適です。

+0

ありがとうございます!モバイルに関する大きなポイント。私は提出時に入力をフィルタリングしようとすることに同意しますが、それは完全に行うことができないと考えています。なぜなら、それが使用されるコンテキストは常に知られているわけではないからです.HTML、JS、例えば)。 – AlwaysLearning

1

私はこれを行うには間違った方法が表示されません。送信するデータの量とレンダリングの速さによって異なります。直接HTMLを挿入するは、JSONまたはXMLから要素を作成するよりも速くです。

Facebookを見ると、すべてのXHRレスポンス(私が見た限りでは、私は探し始めたばかりです)は、XSSは問題を起こすべきではありません。私はあなたの質問を見たとき:)あるような何か:

for (;;);{"__ar":1,"payload":"\u003cdiv class=\"ego_column\">\u003cdiv 
class=\"ego_section\">\u003cdiv class=\"uiHeader uiHeaderTopAndBottomBorder 
mbs uiSideHeader\">\u003cdiv class=\"clearfix uiHeaderTop\">\u003ca 
class=\"uiHeaderActions rfloat\" href=\"http:\/\/www.facebook.com\/campaign\ 
/landing.php?placement=advf2&campaign_id=368901427978&extra_1=auto\"> 
Create an Ad\u003c\/a>\u003cdiv>\u003ch4 class=\"uiHeaderTitle\">Sponsored 
\u003c\/h4> [...]" } 

彼らのAJAXは、コンテンツ重いですので、それはおそらくHTMLを送信するために彼らのためにオフに支払っています。おそらく彼らのアーキテクチャは、構造とプレゼンテーションの分離を扱うでしょう。

+0

興味深い。最初の無限ループ( 'for(;;);')は、JSONのハイジャックを防ぐためのものでなければなりません。はい、出力は常にエスケープする必要がありますが、DOM APIを使用しているように見えますが、HTMLを返すとエラーの余地はありません。しかし、私はFacebookがそれについて非常に慎重であると確信しています。 – AlwaysLearning

関連する問題