2016-04-05 10 views
-1

Xss saldırısını korumak için, aşağıdaki işlevi kullanarak kullanıcıya görüntülemek istediğim her mesajı kodlamaya çalışıyorum., Xss'in kodlamayı kullanmasını önler, ancak kullanıcı okunabilirliği çok zayıf

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); 
} 

Örnek giriş mesajı bu işlev alınan çıktı mesaj aşağıda gibidir

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

aşağıdaki gibidir.

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

Aşağıdaki gibi görüntülemeye çalışıyorum.

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"; 

Her şey iyi çalışıyor, ancak kullanıcı tarafından okunabilirlik çok zayıf.
Kod çözmem gerekiyor mu? Eğer kodu çözersem, o zaman xss saldırısına sebep olur mu?

Herhangi bir öneri lütfen.

+0

Dizeleri kaçmak için 'encodeURIComponent 'kullanmazdım, değiştirilecek şeylerin miktarı aşırı derecede aşırı olur. Bu soruya/cevaplara bakın: http://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript –

cevap

0

URL'ye değil, HTML'ye veri ekliyorsunuz.

XSS karşı savunmak için HTML için doğru kodlaması gerekir. encodeURIComponent, bunun yakınında olmamalı.

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

Orada kullanıcı girişi olarak Start 20 TV's test; star ;; '' -- testagain., comma. </> alıp JavaScript içine koymak için kullanmak istediği yöntemi XSS için bir vektör olabilir ... ama bunu nasıl bize göstermedim.

+0

Kullanıcı mesajlarının saklanması gereken mesajlar olduğunu varsayalım veritabanımda. DB'ye kaydetmeden önce onu kodladım ve DB'ye kaydettim. Kullanıcı verileri tekrar görmek istediğinde, geri almam ve kullanıcıya göstermem gerekiyor. Teşekkür. –

+0

Veritabanına koymadan önce şifrelemeyin (SQL Injection kullanımı hazırlanmış ifadeleri ve ilişkili değişkenleri önlemek için). Sayfaya koymadan önce bunu nasıl kodladığınız, onu veritabanından ve sayfasından çıkarmak için kullandığınız yönteme bağlıdır. Sayfa yüklendiğinde HTML niteliğine mi koyuyorsunuz? Sayfa yükleri ile bir komut dosyası öğesinde ham JavaScript oluşturma? Daha sonra XMLHttpRequest ile alınıyor ve düz metin olarak mı dönüyor? Bunu yapmak için üç farklı teknik ve SQL Injection'a karşı savunmak için üç farklı teknik gereklidir. – Quentin