2016-04-05 6 views
-1

xss攻撃を保護するために、私は以下の機能を使用してユーザーに表示したいすべてのメッセージをエンコードしようとします。Xssのエンコードを防止しますが、ユーザーの読みやすさはあまり良くありません

Start 20 TV's test; star ;; '' -- testagain., comma. </> 

下に、私はこの機能から受信した出力メッセージが以下のようなものであるよう

function encodeRFC5987ValueChars(str) 
{ 
    return encodeURIComponent(str). 
     // Note that although RFC3986 reserves "!", RFC5987 does not, 
     // so we do not need to escape it 
     replace(/['()]/g, escape). // i.e., %27 %28 %29 
     replace(/\*/g, '%2A'). 
      // The following are not required for percent-encoding per RFC5987, 
      // so we can allow for a little better readability over the wire: |`^ 
      replace(/%(?:7C|60|5E)/g, unescape); 
} 

例入力メッセージです。

Start%2020%20TV%27s%20test%3B%20star%20%3B%3B%20%27%27%20--%20testagain.%2C%20comma.%20%3C%2F%3E 

以下のように表示しようとします。

document.getElementById("labelResult").innerHTML = "Start%2020%20TV%27s%20test%3B%20star%20%3B%3B%20%27%27%20--%20testagain.%2C%20comma.%20%3C%2F%3E"; 

すべて正常に動作しますが、ユーザーの可読性は非常に低いです。
デコードする必要はありますか?私がデコードしたら、それはxss攻撃につながるのではないかと心配していますか?

ご提案ください。

+0

私は文字列をエスケープするために 'encodeURIComponent'を使用しません。置き換えるものの量は超過過剰です。この質問/回答を見てみましょう:http://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript –

答えて

0

URLにではなく、HTMLにデータを挿入しています。

XSSを防御するには、のHTMLを適切にエンコードする必要があります。 encodeURIComponentはこれの近くにはいけません。

var textNode = document.createTextNode("Start 20 TV's test; star ;; '' -- testagain., comma. </>"); 
document.getElementById("labelResult").innerHTML = ""; // Erase existing content 
document.getElementById("labelResult").appendChild(textNode); 

あり、ユーザー入力としてStart 20 TV's test; star ;; '' -- testagain., comma. </>を取るとJavaScriptにそれを置くために使用どんな方法でXSSのためのベクターであるかもしれない...しかし、あなたはそれを行う方法を私たちに示していません。

+0

そのメッセージ内のユーザーキーを保存する必要があるとします私のデータベースに。 DBに保存する前に、それをエンコードしてDBに保存します。ユーザーがデータを見たい場合は、検索してユーザーに表示する必要があります。感謝。 –

+0

SQLインジェクションがプリペアドステートメントとバインドされた変数を使用しないように、データベースに格納する前にエンコードしないでください。ページに挿入する前にエンコードする方法は、データベースやページから取得する方法によって異なります。ページが読み込まれたらHTML属性に入れますか?ページが読み込まれたスクリプト要素で生のJavaScriptを生成していますか? XMLHttpRequestを後で入手し、プレーンテキストとして返しますか? SQLインジェクションを防御するためには、3つの異なる手法と3つの異なる手法が必要です。 – Quentin

関連する問題