5

我们在我们的产品上运行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>
4

2 回答 2

3

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

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

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

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

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

于 2016-09-01T10:18:34.443 回答
0

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

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

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

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

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

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

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

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

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

于 2016-09-09T12:19:01.200 回答