0

我对 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 以及为什么它没有被执行。

谢谢和最好的问候,罗纳德

4

1 回答 1

1

这是因为 ext 模板是使用 innerHTML 注入的,这是最快的方法,但有一个缺点是脚本不会被执行。

但是你可以只对 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 (对不起我的英语)

于 2013-08-13T13:07:13.810 回答