我对ExtJS4中的XSS攻击进行了一些测试。我的HTML页面如下所示:
<html>
<head>
<link rel="stylesheet" type="text/css" href="ext-all.css"/>
<script type="text/javascript" src="ext-all-dev.js"></script>
<script type="text/javascript" src="testExtXSS.js"></script>
</head>
<body>
<div id="myDiv"></div>
</body>
</html>
和testExtXSS.js如下所示:
Ext.onReady(function() {
var formPanel = Ext.create('Ext.form.Panel', {
frame: true,
title: 'Form Fields',
width: 340,
bodyPadding: 5,
fieldDefaults: {
labelAlign: 'left',
labelWidth: 90,
anchor: '100%'
},
items: [
{
xtype: 'textfield',
name: 'textfield1',
fieldLabel: '<script>alert(document.cookie)</script>Text field',
value: '<script>alert(document.cookie)</script>Text field'
}
]
});
formPanel.render('myDiv');
});
我希望fieldLabel中的脚本标记能够被执行,但事实并非如此。当我使用Firebug和Chrome开发者工具查看HTML元素时,我可以在HTML树中看到脚本元素。
任何人都可以向我解释ExtJS如何将其插入到DOM中以及为什么不执行它。
谢谢和最诚挚的问候, 罗纳德
答案 0 :(得分:1)
这是因为使用innerHTML注入了ext模板,这是最快的方法,但是缺点是脚本没有被执行。
但是你可以对Ext.dom.Element使用update()方法:
...
{
xtype: 'textfield',
name: 'textfield1',
fieldLabel: '<script>alert(1)</script>Text field',
value: 'some val',
listeners: {
render: function(cmp) {
cmp.getEl().update(cmp.getEl().dom.innerHTML, true);
}
}
}
...
屏幕截图:http://my.jetscreenshot.com/6795/20130813-pdeh-28kb (对不起我的英文)