Mustache-Security网站描述了 KnockoutJS 中的 XSS 漏洞......这些漏洞来自于使用 eval(或其他等价物)将 data-bind 属性中的文本转换为可执行脚本。大多数示例显示了如果将恶意脚本注入到数据绑定属性中可以执行的攻击。
示例(HTML/JavaScript/KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="click: alert(1)"></div>
<div data-bind="value: alert(2)"></div>
<div data-bind="style: alert(3)"></div>
...
<select data-bind="options: alert(99)"></select>
<script>
ko.applyBindings();
</script>
虽然我可以重现定义的示例,但在使用 KnockoutJS 时,我通常会避免将 JavaScript 放入数据绑定属性中。我更喜欢在 JavaScript 对象上引用 observable 属性,以将视图的行为与其布局分开。使用这种方法,我发现 JavaScript 是不可执行的。
示例(HTML/JavaScript/KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="value: firstName"></div>
<script>
var ViewModel = function() {
this.firstName = ko.observable('alert(2)');
}
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
我的应用程序是否仅仅因为我使用了 KnockoutJS 而面临 XSS 风险,或者我是否还必须找到一种方法来使用服务器端代码将不受信任的输入放入数据绑定属性中?
示例(ASP.NET/HTML/JavaScript/KnockoutJS):
<div data-bind="value: <%=Request.QueryString("id")%>"></div>
我认为如果攻击者可以使用 JavaScript 在页面中注入他们的脚本,那么他们可以直接操作 DOM,并且 KnockoutJS 不会增加我的 XSS 风险。
还有什么我想念的吗?我还需要做什么来防止作者描述的 XSS 漏洞?