2012-05-14 302 views
0

我維護一個PHP應用程序。最近用戶報告了以下代碼易受XSS影響。潛在的jQuery XSS

from_name = jQuery("#from_name").val(); 
from_email = jQuery("#from_email").val(); 
subject = jQuery("#subject").val(); 
msg = "From: " + from_name + " (" + from_email + ")<br />"; 
msg = msg + "Subject: " + subject; 
jQuery("#review").html(msg); 

他的建議如下。

from_name = jQuery("#from_name").val(); 
from_email = jQuery("#from_email").val(); 
subject = jQuery("#subject").val(); 
msg = "From: " + from_name.replace(/</g,"&lt;").replace(/>/g,"&gt;") + " (" + from_email.replace(/</g,"&lt;").replace(/>/g,"&gt;") + ")<br />"; 
msg = msg + "Subject: " + subject.replace(/</g,"&lt;").replace(/>/g,"&gt;"); 
jQuery("#review").html(msg); 

如果不明顯,則顯着簡化。無論如何,他的解決方案只是用.replace(/</g,"&lt;").replace(/>/g,"&gt;")來清理潛在的元素,我並不立即遇到問題,但似乎A)不必要或B)不完整。

我考慮過使用.text而不是.html,但後來我無法適當地格式化文本。除非我忽略了一些愚蠢的東西。

我可以看到它是如何易受攻擊的,因爲原始元素是輸入元素,但這些輸入元素是從數據庫中填充的。數據庫最初使用$ _POST進行填充,這是易受攻擊的,但我在將數據提交給數據庫之前對其進行驗證,包括剝離所有HTML標記。

在我看來,如果元素被用戶(看起來很愚蠢)或JavaScript改變,XSS的唯一機會就是在頁面上,無論哪種方式,我的評論元素可能會暫時受到影響,但一旦這種改變被「保存「我的驗證功能將去除惡意更改。

這是一個漫長的問題,我希望我的邏輯是合理的。

+0

這不僅僅是爲了保護您的系統,它也是爲了保護您的用戶。如果有人可以製作一個請求,該請求使用惡意腳本填充'#from_name',那麼攻擊者可以在使其看起來像您的網站的同時危及您的用戶。所以我會同意可能存在XSS問題,我不認爲簡單的替換是解決它的最好方法。 –

+0

對我而言,問題在於我不明白某人如何使用惡意腳本填充'#from_name'。在我這樣做之前,我不知道如何預防這種情況。這有點雞和雞蛋的情況。我知道如何將門窗鎖定到我的房子,但我不明白盜賊能進去什麼,所以我無法阻止它。 – radiok

+0

我看不懂所有的代碼都無法理解。 –

回答

2

儘管如果您正在清理對數據庫的輸入,您可能是正確的,但您可能不會受到攻擊。對出現在數據庫中的任何內容進行清理,總是更好。處理它的更好方法是使用如下所示的$ .text。

from_name = jQuery("#from_name").val(); 
from_email = jQuery("#from_email").val(); 
subject = jQuery("#subject").val(); 
var subjectDiv = jQuery('<div>').attr('id','subjectDiv').text('Subject:'+subject); 
var fromDiv = jQuery('<div>').attr('id','fromDiv').text('From: '+from_name+ ' (' +from_email +')'); 
jQuery("#review").empty(); 
jQuery('#review').append(fromDiv); 
jQuery('#review').append(subjectDiv); 
+0

這很有道理。我雖然'$ .text'可能持有解決方案,並確定了它。謝謝! – radiok