我维护一个 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,"<").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 的唯一机会就是页面上功能将去除恶意更改。
这是一个冗长的问题,我希望我的逻辑是合理的。