0

我维护一个 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 的唯一机会就是页面上功能将去除恶意更改。

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

4

1 回答 1

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);
于 2012-05-24T16:51:34.990 回答