2016-04-05 64 views
-1

爲了保護xss攻擊,我嘗試使用下面的函數對每個要顯示給用戶的消息進行編碼。防止Xss使用編碼,但用戶的可讀性很差

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 20 TV's test; star ;; '' -- testagain., comma. </> 

我從這個函數接收的輸出消息是象下面這樣。

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

您正在將數據插入到HTML中,而不是插入URL中。

爲了防範XSS,您需要對其進行正確編碼,以便爲HTMLencodeURIComponent不應該在這附近。

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

可能是XSS在你使用任何方法採取Start 20 TV's test; star ;; '' -- testagain., comma. </>作爲用戶輸入,並把它放入JavaScript中的矢量...但你怎麼做,你還沒有告訴我們。

+0

讓我們假設用戶鍵在那些必須保持的消息在我的數據庫中。在保存到數據庫之前,我將它編碼並保存到數據庫中。當用戶想要返回數據時,我必須檢索並顯示回用戶。謝謝。 –

+0

在將其放入數據庫之前不要對其進行編碼(以防止SQL注入使用預準備語句和綁定變量)。在將它放入頁面之前,如何對其進行編碼取決於您使用何種方法將它從數據庫和頁面中取出。當頁面加載時將其放入HTML屬性中?在加載頁面的腳本元素中生成原始JavaScript?稍後用XMLHttpRequest獲取並以純文本的形式返回它?三種不同的技術來解決它和三種不同的技術來抵禦SQL注入。 – Quentin