【问题标题】:Prevent Cross Site Request Forgery for JSONP request from a static website with an enquiry form (i.e. Jekyll website)防止来自带有查询表的静态网站(即 Jekyll 网站)的 JSONP 请求的跨站请求伪造
【发布时间】:2013-10-29 17:35:56
【问题描述】:

我需要处理使用 Jekyll 构建的静态网站的查询表。

查询表单将 JSONP 请求 (GET) 提交到处理请求的另一个域上的 PHP 应用程序。

由于表单是静态的,是否可以防止 CSRF?

我注意到 PHP Slim 框架的 CSRF 中间件只保护 POST、PUT 和 DELETE 方法,而不是 GET。

如果我在静态站点中有一个脚本,可以在每个页面加载时使用从服务器请求的数据(cookie 值、csrf 令牌以及字段值等)构建表单,这样可以吗?

感谢您的宝贵时间

【问题讨论】:

  • 你想保护什么...如果用户没有以任何方式进行身份验证,那么提供 CSRF 保护没有任何好处。是这样吗?
  • 没错,用户没有被认证。
  • 无需防范 CSRF,因为表单在当前用户的上下文中提交不会获得任何收益 - 如果攻击者想在您的网站上提交表单,则无需去“跨站点”......他们只会提交它。听起来您正在使用 CAPTCHA 来阻止机器人提交表单(如果那是您真正想要的?)。
  • 没错。再次感谢我希望我能检查您的评论作为正确答案。

标签: javascript php security jsonp csrf


【解决方案1】:

因此无需防范 CSRF,因为在当前用户的上下文中提交表单不会获得任何收益 - 如果攻击者想在您的网站上提交表单,则无需“跨站点” ...他们只会提交它。

听起来您正在使用CAPTCHA 来阻止机器人提交表单(如果您真的想要这样做?)。

【讨论】:

    【解决方案2】:

    没有。

    针对 CSRF 的防御取决于发送请求的页面和发送请求的服务器是否同意用户的唯一标识符。

    由于表单是静态的,您不能在表单中放置唯一标识符。

    如果我在静态站点中有一个脚本,可以在每个页面加载时使用从服务器请求的数据(cookie 值、csrf 令牌以及字段值等)构建表单,这样可以吗?

    仅当它是服务器端脚本时(因此表单不会是静态的),否则任何站点都可以包含它以获取令牌。


    我注意到 PHP Slim 框架的 CSRF 中间件只保护 POST、PUT 和 DELETE 方法,而不是 GET。

    这是因为GET requests shouldn't be doing anything in the first place,所以(除非你滥用它们)没有必要对它们应用 CSRF 保护。

    特别是,已经建立了约定,即 GET 和 HEAD 方法不应具有采取除检索之外的操作的意义。这些方法应该被认为是“安全的”。这允许用户代理以特殊的方式表示其他方法,例如 POST、PUT 和 DELETE,以便让用户意识到正在请求可能不安全的操作。

    【讨论】:

    • 谢谢。我现在想 CORS 可能更可取,因为它支持的不仅仅是 GET 请求,不像 JSONP
    • CSRF 仍然是一个问题,即使使用 CORS。攻击只需要发出请求,不需要将响应暴露给 JS。
    • 酷。我正在考虑一个带有 csrf 令牌的 javascript 编译表单,该表单由服务器通过一个简单的 get jsonp 请求提供,因为它只是检索。表单提交将向 php 应用程序发出 CORS POST 请求以验证请求并采取必要的措施,即发送带有表单值等的电子邮件
    • 如果令牌在 JavaScript 中,那么任何站点都可以包含 .js 文件并获取令牌,这将使其无用。
    猜你喜欢
    • 2014-08-31
    • 2019-05-26
    • 1970-01-01
    • 2014-06-21
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2012-08-14
    相关资源
    最近更新 更多