Qooxdoo 是否受到 XSS 保护

Is Qooxdoo protected against XSS

我正在寻找有关 Qooxdoo 安全性的信息。 我想检查我的应用程序与 OWASP top 10 要审查的一点是 XSS OWASP A3 XSS

我如何确定 Qooxdoo 能够抵御 XSS 攻击? Qooxdoo 是否使用一些消毒工具?

已解决

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

但是,如果您使用 rich=true,则必须检查 input/output

一种常见的 XSS 攻击媒介是攻击者以某种方式将 JS 代码输入 Web 应用程序,然后该代码出现在网页的 DOM 中并因此被激活。

为了防止这种 XSS,您必须确保后端服务器不会将用户生成的 (un-cleaned) html 发送到浏览器...(这与此无关与 qooxdoo).

也就是说,常规的 qooxdoo 小部件通常不会将数据显示为 html,因此即使没有智能服务器,您也相当安全。例外是 qx.ui.basic.Label 小部件及其后代。如果您设置 rich 属性,Label 小部件可以直接显示 HTML。 rich 属性 默认设置为 false,但如果启用它,则必须确保不显示 'dangerous' 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

如果你确实使用qx.html.*qx.bom.*qx.dom.*objects直接使用DOM,你就超出了qooxoo和必须注意采取相应的行动。

另一个重要的攻击媒介是身份验证 cookie。大多数攻击的工作原理是让浏览器在用户不知情的情况下将请求连同 cookie 一起发送到其服务器。

Qooxdoo 本身 要求您使用 cookie。由于 qooxdoo 应用程序设计 运行 在单个浏览器 window 中,您可以在不使用 cookie 的情况下工作。实现这样的一个简单方法是使用一个 'server access singleton' 来处理与后端的所有通信,并在每个请求中添加一个特殊的 header 来提供访问令牌。

下面的代码可以作为 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;
        }
    }
});

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

 /**
 * 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);
},

查看 the CallBackery application 了解其在实际应用中的工作原理。