我維護一個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,"<").replace(/>/g,">") + " (" + from_email.replace(/</g,"<").replace(/>/g,">") + ")<br />";
msg = msg + "Subject: " + subject.replace(/</g,"<").replace(/>/g,">");
jQuery("#review").html(msg);
如果不明顯,則顯着簡化。無論如何,他的解決方案只是用.replace(/</g,"<").replace(/>/g,">")
來清理潛在的元素,我並不立即遇到問題,但似乎A)不必要或B)不完整。
我考慮過使用.text
而不是.html
,但後來我無法適當地格式化文本。除非我忽略了一些愚蠢的東西。
我可以看到它是如何易受攻擊的,因爲原始元素是輸入元素,但這些輸入元素是從數據庫中填充的。數據庫最初使用$ _POST進行填充,這是易受攻擊的,但我在將數據提交給數據庫之前對其進行驗證,包括剝離所有HTML標記。
在我看來,如果元素被用戶(看起來很愚蠢)或JavaScript改變,XSS的唯一機會就是在頁面上,無論哪種方式,我的評論元素可能會暫時受到影響,但一旦這種改變被「保存「我的驗證功能將去除惡意更改。
這是一個漫長的問題,我希望我的邏輯是合理的。
這不僅僅是爲了保護您的系統,它也是爲了保護您的用戶。如果有人可以製作一個請求,該請求使用惡意腳本填充'#from_name',那麼攻擊者可以在使其看起來像您的網站的同時危及您的用戶。所以我會同意可能存在XSS問題,我不認爲簡單的替換是解決它的最好方法。 –
對我而言,問題在於我不明白某人如何使用惡意腳本填充'#from_name'。在我這樣做之前,我不知道如何預防這種情況。這有點雞和雞蛋的情況。我知道如何將門窗鎖定到我的房子,但我不明白盜賊能進去什麼,所以我無法阻止它。 – radiok
我看不懂所有的代碼都無法理解。 –