我正在寻找有关 Qooxdoo 安全性的信息。我想检查我的应用程序与OWASP 前 10 名 要审查的是 XSS OWASP A3 XSS
我如何确定 Qooxdoo 对 XSS 攻击是安全的?Qooxdoo 是否使用一些消毒工具?
解决了
所有讨论的简短回答。是的,Qooxdoo 是 XSS 安全的。默认情况下,不会执行任何字段中的 javascript 值。
但是,如果你使用rich=true,你必须检查输入/输出
我正在寻找有关 Qooxdoo 安全性的信息。我想检查我的应用程序与OWASP 前 10 名 要审查的是 XSS OWASP A3 XSS
我如何确定 Qooxdoo 对 XSS 攻击是安全的?Qooxdoo 是否使用一些消毒工具?
解决了
所有讨论的简短回答。是的,Qooxdoo 是 XSS 安全的。默认情况下,不会执行任何字段中的 javascript 值。
但是,如果你使用rich=true,你必须检查输入/输出
一个常见的 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
如果您确实使用qx.html.*andqx.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;
}
}
});
如果您在其中提供登录弹出窗口,如果后端对您的请求不满意,则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);
},
查看CallBackery 应用程序,了解它在实际应用程序中的工作原理。