我已经实现了一个简单的GWT应用程序,该应用程序具有登录服务(LoginService)和工作程序服务(WorkerService)。两者都是GWT-RPC。通过实现GWT的最新XsrfProtectedServiceServlet(请参阅GWT Xsrf-Safe Sample Projetct),我保护了所有服务免受XSRF的侵害。
实现此示例时,在页面加载时就在JSP文件中创建了 session ID。在这种情况下,即使用户未登录也是如此。
这是正确的方法吗?还是我必须在LoginService中创建 session ID(设置cookie)?但是,当以这种方式实现它时,LoginService本身不容易受到XSRF攻击吗?
谢谢,
帕斯卡
最佳答案
首先,简要回顾一下XSRF:
<img>
标记(或某些提交POST形式的JavaScript,...)现在很容易看出,不能使用XSRF攻击登录服务本身,因为到那时,用户尚未获得授权-攻击者必须知道用户的凭据才能执行登录。 (如果用户已经登录,则调用登录服务应该什么都不做![*])
注意:当然,攻击者可能会采用其他技术来对用户的凭据进行攻击,最著名的是:网络钓鱼。反XSRF措施不能保护您免受此侵害。
[*]如果您的服务无法使用反XSRF token 进行保护(例如登录服务),则尤其要确保它们不返回包含任何有值(value)信息的有效JSON/JavaScript!
如果绝对需要,请务必将响应包装在JavaScript注释(
/* */
)中,如http://code.google.com/webtoolkit/articles/security_for_gwt_applications.html#json中所述。甚至更好:按照Why have "while(1);" in XmlHttpRequest response?中的说明,在响应之前添加while(1);
。无论如何,这是一个好习惯。