2017-11-10 42 views
0

私はlaravelを使用しています。ユーザーがテキストメッセージを送信すると、いくつかの悪質なコードが含まれている可能性があります。 {{}}を使用すると、ユーザーが送信した正確なテキストが表示されます。彼はjquery - XSSを防ぐためにHTMLをエスケープする方法は?

<script>alert("malicious")</script> 

を送信した場合、それはまったく同じに表示され、それは良いことだが、私はjqueryのAJAXを使用する場合、私はいくつかのHTMLタグ内にいくつかの変数にフェッチされたデータを入れて、最後にメインタグにそれらのすべてを追加しますそのような:

data = ''; 
    //loop starts here // some otger codes deleted for cleanness 
    data += "<h2>"+response.name+"</h2>"; 
    data += "<p>"+response.description+"</p>"; 
    $('#mydata').html(data); 

と今の問題は、私はhtml()を使用する場合、ユーザー悪意のあるコードが実行されると、私がいない場合、結果はHTMLとして表示されないことです。

私は$.parseHTMLで何かするべきだと思いますか?

おかげ

答えて

3

あなたは、データをエンコードするためのjQuery text()を使用する必要があります。

$('#mydata').text(data); 

EDIT:あなたははHTMLなどのユーザデータをレンダリングし、同じ時間に安全な方法にそれを免れることはできない

$('#mydata') 
    .html("") 
    .append($("<h2></h2>").text(response.name)) 
    .append($("<p></p>").text(response.description)) 
+0

私は 'text()'を使うとHTMLタグのスタイルを表示するのではなくシンプルテキストであると言っていました。 h2タグとpタグを単純なrextとして表示しないようにしたいが、他のタグは表示したくない。 – codepro

+0

私は、更新された答えを参照してください – Joschi

+0

速い返信のおかげで、あなたは良いアイデアを述べたが、私の場合はいくつかの違いがあります。私はフェッチされるべき多くのデータを持っています。あなたのアプローチではできない部分は次のとおりです: – codepro

0

を使用することができます#mydataのコンテンツを作成します。 いくつかのgod-level regexがタグだけでなく属性だけを削除するのに役立つと思われるかもしれません。残念ながら、JSをマークアップに挿入する方法はたくさんあるので、決して確実なことはありません。

だから、あなただけのいくつかのオプションがあります:

  1. はすべて

  2. エスケープすべてのもの((jQueryのテキストを使用して)、またははhtmlspecialcharsとバックエンド側のエスケープのいずれか()

  3. でリスクを無視します
  4. 非HTMLマークアップを使用し、単純なルールで制御された方法でHTMLに変換されます。

+0

私の悪い、取得できませんでしたこの特定のケースでは、ユーザーデータの書式を保持する必要はありません。したがって、答えは「一般的」ですが、上記の答えは確かにその場合に当てはまります – skyboyer

関連する問題