Docusign EventNotification CSRF 保护
Docusign EventNotification CSRF Protection
我正在尝试使用 Docusign REST API(Java 特定)向我的应用程序添加 docusign 功能。我将 com.docusign.esign.model.EventNotification 添加到我的 EnvelopeDefinition 中,以便我可以从 docusign 获得通知 - 我想知道何时有人 signs/views 文档,以便我可以更新我自己的内部数据并通知下一个人在链中,他们应该签署一份文件。
问题出在 Spring 安全的 CSRF 保护上。 EventNotifications 已发送到我的服务器,但由于 403 错误而被阻止。
其他一切正常 - 创建了信封,我可以进行嵌入式签名,我可以手动轮询 docusign 以获取 envelope/recipient 状态等。而且我知道回调正在返回。如果我在我的 Spring 配置中禁用 CSRF 保护,那么事件通知会触发我配置的回调 URL 并按预期进行处理。如果我打开 CSRF 保护,我的服务器日志会显示回调 URLs.
的 403 错误
显然我不想禁用 CSRF 保护。并且专门针对该侦听器有选择地禁用 CSRF 保护似乎没有意义 URL。但我不确定如何进行。我正在仔细阅读文档,但没有看到任何提示我如何处理来自 docusign 的回调的 CSRF。
我应该用不同的方式来处理我的配置吗?也许为这个回调禁用 CSRF 确实有意义,因为我绝对希望它来自某些外部源。但是我该如何保护它呢?我应该为此特定事件禁用 CSRF 并实施不同的安全措施吗?
我正在使用 Spring 4.3.8、Docusign API 3.1.0 和 Struts 2.3.37。
TL;DR:我建议您设置一个单独的 Spring 服务器(侦听器)来接收事件通知。 webhook 通知无法通过标准 GET/POST CSRF 防御中使用的声明,因为没有 GET。
详情
典型的 GET(表单)后跟 POST(表单)流程通过在将表单发送到浏览器时包含一个 nounce 值并检查是否提供了相同的值来防止 CSRF 攻击在 POST.
使用 webhook 通知(例如 DocuSign 的 Connect / eventNotification 系统),用于停止 CSRF 攻击的通知模式将不起作用,因为您的应用程序不会也无法预测通知何时会 POSTed 到您的应用程序通过网络钩子。 (您的应用程序没有向 webhook 软件发送任何表单。)
此问题对所有 webhook 实现都很常见,并非特定于 DocuSign。
相反,为了防止有人发送伪造的 webhook 通知消息,使用了不同的技术。如今,一种常见且安全的技术是在通知中包含 HMAC 数字签名。 HMAC 以加密方式保证消息由授权发件人发送,并且在传输过程中未被更改。
您的应用应为其 GET/POST 流使用反 CSRF 防护。如果您不能仅针对应用上的通知端点禁用 CSRF 检查,我建议使用两台服务器,其中一台将只接收 webhook 事件通知。
我正在尝试使用 Docusign REST API(Java 特定)向我的应用程序添加 docusign 功能。我将 com.docusign.esign.model.EventNotification 添加到我的 EnvelopeDefinition 中,以便我可以从 docusign 获得通知 - 我想知道何时有人 signs/views 文档,以便我可以更新我自己的内部数据并通知下一个人在链中,他们应该签署一份文件。
问题出在 Spring 安全的 CSRF 保护上。 EventNotifications 已发送到我的服务器,但由于 403 错误而被阻止。
其他一切正常 - 创建了信封,我可以进行嵌入式签名,我可以手动轮询 docusign 以获取 envelope/recipient 状态等。而且我知道回调正在返回。如果我在我的 Spring 配置中禁用 CSRF 保护,那么事件通知会触发我配置的回调 URL 并按预期进行处理。如果我打开 CSRF 保护,我的服务器日志会显示回调 URLs.
的 403 错误显然我不想禁用 CSRF 保护。并且专门针对该侦听器有选择地禁用 CSRF 保护似乎没有意义 URL。但我不确定如何进行。我正在仔细阅读文档,但没有看到任何提示我如何处理来自 docusign 的回调的 CSRF。
我应该用不同的方式来处理我的配置吗?也许为这个回调禁用 CSRF 确实有意义,因为我绝对希望它来自某些外部源。但是我该如何保护它呢?我应该为此特定事件禁用 CSRF 并实施不同的安全措施吗?
我正在使用 Spring 4.3.8、Docusign API 3.1.0 和 Struts 2.3.37。
TL;DR:我建议您设置一个单独的 Spring 服务器(侦听器)来接收事件通知。 webhook 通知无法通过标准 GET/POST CSRF 防御中使用的声明,因为没有 GET。
详情
典型的 GET(表单)后跟 POST(表单)流程通过在将表单发送到浏览器时包含一个 nounce 值并检查是否提供了相同的值来防止 CSRF 攻击在 POST.
使用 webhook 通知(例如 DocuSign 的 Connect / eventNotification 系统),用于停止 CSRF 攻击的通知模式将不起作用,因为您的应用程序不会也无法预测通知何时会 POSTed 到您的应用程序通过网络钩子。 (您的应用程序没有向 webhook 软件发送任何表单。)
此问题对所有 webhook 实现都很常见,并非特定于 DocuSign。
相反,为了防止有人发送伪造的 webhook 通知消息,使用了不同的技术。如今,一种常见且安全的技术是在通知中包含 HMAC 数字签名。 HMAC 以加密方式保证消息由授权发件人发送,并且在传输过程中未被更改。
您的应用应为其 GET/POST 流使用反 CSRF 防护。如果您不能仅针对应用上的通知端点禁用 CSRF 检查,我建议使用两台服务器,其中一台将只接收 webhook 事件通知。