--更新--
当您说“小部件”时,如果您的意思是未经身份验证的人与之交互的应用程序之外的东西,那么请忽略此答案。我重读了您的问题,但您从未真正说明“小部件”的含义。我们的应用程序中有各种“小部件”。我以为这就是您所说的,只有经过身份验证的用户才能与之交互的应用程序中的所有内容。如果是这种情况,那么这个答案就是 OWASP 推荐的。
--原始答案--
“您不希望此请求易受 CSRF 攻击,因此您将 iframe 写入页面。” 不,不要制作 iframe,这样您就可以执行正常的 OWASP 建议来防止跨站点框架。
为了防止 CSRF 散列某些值,请将其包含在您的表单(或 ajax POST 数据)中,然后检查后端的散列值。如果匹配,则来自您的站点。您可以将越具体的数据放入散列中越好。
示例:当用户登录时,您可以创建一个长的随机字符串并将其绑定到他们的会话。此字符串绝不能在您的网站上或查看源代码时可见。然后假设用户提取了一些他们想要编辑的特定记录。然后,您可以使用您创建的用户长随机字符串,将记录主键附加到它,然后对它们进行哈希处理。该哈希的结果可以作为隐藏的形式包含在表单中。然后在你的后端,在你做任何事情之前检查隐藏的存在,如果它不存在,中止。如果确实存在,请获取用户随机会话字符串和他们提交的明文主键,对它们进行哈希处理,如果匹配,您就知道它来自您的站点。
即使您的网站已经编写好,也很容易在任何地方添加它(假设您的网站在所有页面上都包含一些单段代码,例如页脚)。制作散列值并将其放置在页脚某处的隐藏 div 中。然后你可以使用jQuery动态添加这个hash值隐藏到页面上的所有表单中。并且您可以使用 jQuery.ajaxPrefilter 自动将其添加到所有 ajax POST,以防您正在执行 ajax 发布而不是普通表单发布。我们已经保护了一些已经以这种方式编码的非常大的网站。
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
如果这听起来像你想走的那条路,我可以展示一些 jQuery 代码来做这件事。至于你在散列什么,你想如何在后端检查它等等......这一切都取决于你是否使用 ColdFusion、PHP、PL/SQL (psp) 等......我可以指出你正确的方向,如果它是其中之一。