防止对动态创建的 DOM 网页和动态生成的 JavaScript 事件处理程序的 XSS 攻击



我读过下面的文章:

https://msdn.microsoft.com/en-us/library/bb355989.aspx

现在,本文使我能够了解XSS漏洞防御,该网页由在网页上构建的asp和html控件静态组成,就像真正的标记布局方式一样。我现在明白,该控件输入不仅应该在验证中使用服务器端,而且输入应该验证长度、范围、格式和类型。我的问题是,我正在尝试清理一个网站,其中页面布局控件在页面加载时动态构建到 DOM 对象上。例如,在页面上,加载事件方法在调用方法期间生成整个网页的方法中一次向文档对象添加一个控件。此外,控件事件处理由在页面加载期间发送串联的 JavaScript 字符串作为输出到处理页面控件事件的页面的方法完成。我想我的问题是,当构建所有内容时,我如何在功能上使用 asp.net 验证控件、正则表达式检查等,网页加载时的 DOM 和 JavaScript 事件处理?

怕MS的文章误导了你。它代表了一种被误导的、名誉扫地的处理注射问题的方法。(ASP.NET 特别是请求验证是不可靠的浪费您的时间。

输入验证对于确保传入数据符合预期的业务规则并且不包含令人困惑的字符(如控制字符)很有价值,但它不是防止导致跨站点脚本的 HTML 或 JS 注入问题的可靠方法。

防止注入问题的方法是,每当将文本插入更广泛的上下文时,对文本进行编码以适应该上下文。因此,当您将字符串模板化为 HTML 时,请对其进行 HTML 转义;当您将参数放入 URL 时,URL 转义;当您将字符串写入<script>块时,JS-转义它,依此类推。

在 ASP.NET 模板中,这意味着使用 <%: ... %> 结构将内容放在页面中而不是<%= ... %>,因为此 HTML 自动转义。(在 Razor 中,@{...}构造也会自动转义。

在客户端,您必须查看用于创建新 DOM 元素的代码。通常,要注意的经典错误模式是创建插入字符串的标记,例如:

element.innerHTML = '<div>Hello, '+name+'</div>';

这里的快速解决方法是编写一个函数在客户端执行 HTML 转义,例如:

function escapeHTML(s) {
    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
}
element.innerHTML = '<div>Hello, '+escapeHTML(name)+'</div>';

通常最好通过将数据直接写入 DOM 属性来避免这种 DOM-XSS 问题,因此您无需执行任何转义:

var div = document.createElement('div');
div.textContent = 'Hello, '+name;
element.appendChild(div);

(同样,如果使用 jQuery,则更喜欢设置 text()attr() 而不是html()

最新更新