Qooxdoo是否受到XSS保护

Ben*_*SIA 4 xss qooxdoo jspresso

我正在寻找有关Qooxdoo安全性的信息.我想查看我的应用程序与OWASP前10名 要点的是XSS OWASP A3 XSS

我怎样才能确定Qooxdoo是否可以抵御XSS攻击?Qooxdoo会使用一些消毒剂工具吗?

解决了

所有讨论的简短回答.是的Qooxdoo是XSS安全的.默认情况下,不会执行任何字段中的javascript值.

但是,如果使用rich = true,则必须检查输入/输出

Tob*_*ker 6

常见的XSS攻击向量是攻击者以某种方式将JS代码输入到Web应用程序中的情况,这样该代码就会显示在网页的DOM中并因此被激活.

为了防止这种XSS,你必须确保后端服务器不发送生成的用户(未清洗)对HTML浏览器...(这有没有关系的Qooxdoo).

也就是说,常规qooxdoo小部件通常不会将数据显示为html,因此即使没有聪明的服务器,您也是相当安全的.qx.ui.basic.Label小部件及其后代是个例外.如果设置rich属性,Label小部件可以直接显示HTML .该rich属性false默认设置为,但如果启用它,则必须确保不显示"危险"的html内容.

只有极少数(非必要的)qooxdoo小部件允许您将HTML代码插入DOM.在这些情况下,您必须注意清理数据.有问题的小部件是:

qx.ui.embed.Html
qx.ui.table.cellrenderer.Html
qx.ui.progressive.renderer.table.cell.Html
qx.ui.virtual.cell.Html
qx.ui.virtual.layer.HtmlCell
qx.ui.virtual.layer.HtmlCellSpan
Run Code Online (Sandbox Code Playgroud)

如果您确实使用qx.html.*qx.bom.*qx.dom.*对象直接使用DOM,那么qooxoo无法使用,并且必须小心谨慎行事.

另一个重要的攻击媒介是认证cookie.大多数攻击的工作原理是让浏览器将请求与cookie一起发送到其服务器而用户不知道它.

本身的Qooxdoo也不会要求你在所有使用Cookie.由于设计的qooxdoo应用程序在单个浏览器窗口中运行,因此您可以在不使用cookie的情况下工作.实现这种方法的一种简单方法是使用"服务器访问单例"来处理与后端的所有通信,并在添加到每个请求的特殊标头中提供访问令牌.

下面的代码可以作为Cookie问题的指南.

qx.Class.define('myapp.Server', {
    extend : qx.io.remote.Rpc,
    type : "singleton",

    construct : function() {
        this.base(arguments);
        this.set({
            timeout     : 60000,
            url         : 'QX-JSON-RPC/',
            serviceName : 'default'
        });
    },

    properties: {
        sessionCookie: {
            init: null,
            nullable: true
        }
    },

    members : {
        /**
         * override the request creation, to add our 'cookie' header
         */
        createRequest: function() {
            var req = this.base(arguments);
            var cookie = this.getSessionCookie();
            if (cookie){
                req.setRequestHeader('X-Session-Cookie',this.getSessionCookie());
            }
            return req;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您提供登录弹出窗口,如果后端对您的请求不满意,您myapp.uiLogin可以callAsync通过添加以下内容来弹出登录窗口来替换标准.

 /**
 * A asyncCall handler which tries to
 * login in the case of a permission exception.
 *
 * @param handler {Function} the callback function.
 * @param methodName {String} the name of the method to call.
 * @return {var} the method call reference.
 */
callAsync : function(handler, methodName) {
    var origArguments = arguments;
    var origThis = this;
    var origHandler = handler;
    var that = this;
    var superHandler = function(ret, exc, id) {
        if (exc && exc.code == 6) {
            var login = myapp.uiLogin.getInstance();

            login.addListenerOnce('login', function(e) {
                var ret = e.getData();
                that.setSessionCookie(ret.sessionCookie);
                origArguments.callee.base.apply(origThis, origArguments);
            });

            login.open();
            return;
        }

        origHandler(ret, exc, id);
    };

    if (methodName != 'login') {
        arguments[0] = superHandler;
    }

    arguments.callee.base.apply(this, arguments);
},
Run Code Online (Sandbox Code Playgroud)

看一下CallBackery应用程序,了解它在实际应用程序中的工作原理.