2016-08-19 14 views
-1

私はBloggersBlogsを持っています。各blogbloggerに関連付けられています。 Jennellのblog最初のtitle属性は、特定の状況で適切にサニタイズされていない場合にトリガすることができ、いくつかのJavaScriptを持っていることを選択ボックス内のオプションを更新するAJAX応答をサニタイズ

blog records

注意:ここではブログのレコードの画像です。

これはまさにそのような状況の1つです。最初の選択ボックスについては

two select boxes

:私は、2つの選択ボックスを持っているユーザーはBlogger選びます。これが発生した場合:

  • をAJAXリクエストがその選択Blogger
  • のために関連付けられているBlogsのすべてをつかむためにサーバーに送信されます、サーバーはそのbloggerに関連付けられているすべてのblogsをつかみ、背中要求者に送信し
  • AJAXリクエストのため
  • 応答は
  • AJAXリクエストに対する応答は、次にGであったことBlog選択ボックス全てblogsのオプションとして追加Blog選択ボックス内のすべてのオプションを削除しますサーバー上で騒々しい。

Jennellという名前Bloggerはjavascriptのハックが含まれていtitleと関連するblogを持っています。したがって:Jennell Bloggerが選択されますとき:

彼女の関連する Blog内ハック

selecting blogger

が実行されます:

:ここ

javascript executed

は、AJAX要求の実際のコードです

$("body").on('change', '[data-action="blogger_sel"]', function() { 
    var blog_sel = $(this).closest('[data-parent-for="blog_sel"]').find('[data-action="blog_sel"]'); 
    $.ajax({ 
    url: "/blogs", 
    type: "GET", 
    data: {blogger_id: $(this).val()}, 
    success: function (data) { 
     blog_sel.children().remove(); 
     $.each(data, function (index, value) { 
     /* DO NOT APPEND THIS WAY. VULNERABLE TO USER-ENTERED JAVASCRIPT EXECUTING */ 
     blog_sel.append('<option value=' + value.id + '>' + value.title + '</option>'); 
     }); 
    } 
    }) 
}); 

AJAXリクエストの問題はこの部分です:

value.title 

私はそれを浄化する必要があります。

質問:AJAXの回答:value.titleはどのようにして浄化できますか?

+0

あなたは、データベースに挿入する前にコンテンツをサニタイズする必要があり、あなたは(質問のこの種を尋ねることはありませんデータクライアント側をサニタイズする)。単純に、 'title'のためにタグを許可しません。 – skobaljic

+0

@skobaljicそれは良い点です。しかし、これはもっと練習です。私はそれをより現実的にすることを推測する:それにいくつかのハックを持つ巨大なデータベースがあるとふりをする。私たちはタグの属性を浄化しますが、何らかの理由で古いデータを浄化することはできませんので、クライアント側でそれを消毒します。 – Neil

+0

あなたの質問は、あなたが既に[回答](http://stackoverflow.com/questions/822452/strip-html-from-text-javascript)を持っているので、「あなたが既にタグを文字列から取り除く方法」でなければなりません。 jQuery 'text()'メソッドです。 Javascriptを使用して出力をサニタイズする方法を尋ねることは、ほとんど起こりませんので、混乱する可能性があります。 – skobaljic

答えて

1

属性を使用してテキスト/値を設定します.HTML文字列ではありません。

var str = "<script>alert('x');<\/script>Test", 
 
    opt = $("<option></option>", { "text" : str, value : "foo" }); 
 
$("select").append(opt);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select></select>

+0

あなたの答えをありがとう。それは動作しますが、私はなぜ*動作しているのか分かりません。スクリプトタグを無視することを知っているオプションの 'text'値を明示的に設定しているので、私は推測していますか?私はタグの代わりにテキストとしてhtmlに追加することを知っていると思いますか? – Neil

+0

テキストはテキストであるため、[htmlエンティティ](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references)を表示するので、実際の文字が表示されます。 – epascarello

0

誰もが疑問にコードソリューションを見たい場合:

$("body").on('change', '[data-action="blogger_sel"]', function() { 
    var blog_sel = $(this).closest('[data-parent-for="blog_sel"]').find('[data-action="blog_sel"]'); 
    $.ajax({ 
    url: "/blogs", 
    type: "GET", 
    data: {blogger_id: $(this).val()}, 
    success: function (data) { 
     blog_sel.children().remove(); 
     $.each(data, function (index, item) { 
     blog_sel.append($('<option>', { 
      value: item.id, 
      text : item.title 
     })); 
     }); 
    } 
    }) 
}); 
関連する問題