潜在的jQuery XSS

时间:2012-05-14 19:07:42

标签: jquery xss

我维护一个PHP应用程序。用户最近报告以下代码易受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的唯一机会就在页面上,无论哪种方式,我的评论元素可能会暂时受到损害,但一旦更改被“保存” “我的验证功能会消除恶意变更。

这是一个冗长的问题,我希望我的逻辑是合理的。

1 个答案:

答案 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);