【问题标题】:How to Prevent Cross-Site Request Forgery Attack?如何防止跨站请求伪造攻击?
【发布时间】:2017-01-09 02:26:56
【问题描述】:

我们在我们的产品上运行了Burp Suite 并发现了一些安全漏洞。该工具检测到一些容易受到跨站请求伪造攻击 (CSRF) 的 CGI 文件。

像往常一样,我在 CPAN 上搜索了 CSRF 保护模块,找到了CGI::Application::Plugin::ProtectCSRF

我想知道如何以通用方式将此模块集成到我们的应用程序中?我不清楚文档。如何配置此模块并进行最少的更改以确保整个应用程序不受 CSRF 的影响。

我还遇到了mod_csrf(一个防止 CSRF 的 Apache 模块)。安装此模块并在 apache 配置文件中进行以下设置是否足以防止 CSRF?

<VirtualHost>

    CSRF_Enable on
    CSRF_Action deny
    CSRF_EnableReferer off

</VirtualHost>

【问题讨论】:

  • 你的应用是基于 CGI::Application 的吗?
  • @Dr.Avalanche:是的,它基于 CGI::Application。
  • 您需要确保任何 Ajax 请求也包含 csrf 参数。
  • @xxfelixxx:mod_csrf 做到了。 C::A::P::ProtectCSRF 没有提到。

标签: apache perl csrf csrf-protection cgi-application


【解决方案1】:

我可以理解您发现CGI::Application::Plugin::ProtectCSRF 的文档不清楚:它有点坚不可摧

Perl 模块似乎所做的只是将hidden 字段添加到名称为_csrf_id 的每个HTML 表单以及从各种来源派生并通过SHA1 编码的随机值。当客户端的响应要求必须向服务器返回相同的值时,保护就出现了

它的编码非常好,但它使用自定义子例程属性attributes pragma 的文档说明了这一点

警告:此处描述的机制仍处于试验阶段。不要依赖当前的实现

从我的快速回顾中我无法判断子例程原型是否对模块至关重要,但我建议您改用 Apache mod_csrf 模块,它可能比 Perl 模块经过更彻底的测试,并且具有适当的文档

【讨论】:

    【解决方案2】:

    由于我们使用的是内部服务器,而不是 apache,因此无法实现 mod_csrf。

    由于文档不清楚,我放弃了 ProtectCSRF 模块。

    我通过以下操作解决了它:

    1. 在标题模板中添加一个所有页面通用的元素,该元素包含从服务器传递的 CSRF 令牌
    2. 创建一个 JavaScript 函数并将其绑定到 onload 事件。此 JS 函数执行以下任务:

      a) 在当前页面中查找表单

      b) 如果找到表单,则创建一个隐藏的“输入”元素并将其附加到每个表单

      c) 获取放在 header 中的值并将其分配给上面创建的元素

      d) 现在所有表单都有一个隐藏的输入元素,其中包含来自第 1 点的 CSRF 令牌

    3. 现在,每当提交表单时,也会提交此隐藏元素,我们正在服务器端验证其值。如果令牌不匹配,则存在 CSRF,为此我们会抛出错误并阻止请求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 2014-06-02
      • 2011-01-11
      • 1970-01-01
      • 2015-07-08
      • 2014-08-31
      • 2019-05-26
      • 2015-07-14
      相关资源
      最近更新 更多