我的书签可以从任何网站调用,基本上允许用户从远处插入一行 - 如果他已登录。
现在我想为我的网站启用CSRF保护,因为书签基本上是非伪造的跨网站请求,我想到了我如何区别于伪造的。) 这不是一个高安全性的环境,但我也对原则感兴趣。
我以为我有办法解决这个问题,但后来意识到它有很多问题。
我根本没想到的一件事是Sripathi Krishnan建议使用iframe。
我没有指定我的用例,所以是的,iframe是前面提到的有效解决方案 问题
然而,实际上我的书签目前确实在运行时与网站进行了一些基本的交互(意味着表格已经存在,用户可以在网站DOM中更改他的选择,这应该改变表格)。我已经准备好为我的用例忽略这个功能,如果事实证明,没有合理安全的方式来区分伪造的非伪造跨站点请求 - 但我仍然对理论水平感兴趣。
答案 0 :(得分:6)
在不删除伪造部分的情况下,您无法进行跨站点请求。但对于您的用例,我认为您不需要跨站点请求。
让我们假设您的服务允许用户为他希望的任何页面添加书签。 bookmarklet的工作是将{url,title}保存到数据库中。同时,您希望防止恶意网站自动为已登录的用户保存网址。
以下是我要解决的问题 -
这或多或少是Google阅读器作为其书签的一部分。这是它的书签的代码 - 注意它没有任何标记
javascript:
var b=document.body;
var GR________bookmarklet_domain='http://www.google.com';
if(b&&!document.xmlVersion) {
void(z=document.createElement('script'));
void(z.src='http://www.google.com/reader/ui/link-bookmarklet.js');
void(b.appendChild(z));
}
else{}
编辑: 您仍然可以支持与iframe方法的互动。 bookmarklet在网站的上下文中执行,因此它可以访问DOM。您可以随意与网站进行互动。准备好保存后,打开Iframe。 iframe将是一个只有一个保存按钮的排序确认屏幕。
诀窍是延迟iframe的创建。您只能在用户准备保存时创建iframe。
答案 1 :(得分:1)
如果小书签存储在Web浏览器中,那么包含在数据库中散列的秘密密钥的想法是个好主意。这将阻止CSRF,虽然它并不理想,因为从某种意义上说,这是一个不会超时的会话ID。应该清楚的是,此令牌仅用于此bookmarklet操作。尽管有此限制,您不太可能遇到攻击。添加HTTPS会使其更强大,因为它更难以溢出此令牌。
如果小书签来自第三方网站,那么您无能为力。这是CSRF的定义。