AEM:调用 Post servlet 时出现 403 Forbidden

Posted

技术标签:

【中文标题】AEM:调用 Post servlet 时出现 403 Forbidden【英文标题】:AEM: 403 Forbidden occurs when call a Post servlet 【发布时间】:2017-01-05 04:20:23 【问题描述】:

我的问题与此类似:CQ5: 403 Forbidden occurs when call a Post servlet 但在 AEM 6.1 中

根据上述主题的接受答案,我必须从 Apache Sling Referrer Filter 中删除 POST。我想知道这个操作是否对我的系统有害? 并且有更好的方法来解决这个问题吗?

p/s:对不起我的英语。

【问题讨论】:

【参考方案1】:

如果您在作者模式下测试您的代码,您会收到403 forbidden 请求错误。这需要 csrf 令牌(在 AEM 6.1 中引入以对来自浏览器的 POSTPUTDELETE 请求针对 CSRF attacks 执行检查)。 CSRF 令牌在服务器端提交表单时进行验证。如果添加了 granite.jquery 依赖项,则会加载 CSRF 保护框架,或者您可以声明依赖项 granite.csrf.standalone 以使用该框架。在发布时,它应该在登录前正常工作。

【讨论】:

【参考方案2】:

如果您尝试从 AEM 外部将数据发布到 AEM 实例,这就是解决方案。出于安全原因,不建议这样做。但是,如果必须的话,您可以为您的 POST 请求添加身份验证并设置 CSRF 安全措施。除此之外,您可以设置您的调度程序以仅允许 POST 请求到选择性路径并阻止其余路径。即便如此,遵循所有这些并不能保证完全安全。

对于替代方案,我不确定您的用例是什么,但您可以在 AEM 中创建一个表单并通过该表单以及您当前尝试将 POST 发送到 AEM 的任何外部资源处理 POST,将此表单包含为框架。

【讨论】:

【参考方案3】:

修改内容需要 POST 调用。除非您的实例没有受到调度程序和 Akamai 服务器在 AEM 前面的更多请求处理机制的保护,否则您可以在调度程序和之前甚至在 akamai 级别进行请求过滤,并且只允许确切的发布请求针对特定应用。

调度过滤器示例:

这表明只允许使用 @SlingServlet(paths = "/bin/sling/myproj/exampleauthhandler") 进行 post 调用

/filter 
    /0001   /glob "*" /type "deny" 
    /0999  /type "allow" /method "POST" /url "/bin/sling/myproj/exampleauthhandler" 

您可以找到有关 AEM 调度程序的更多信息

https://docs.adobe.com/docs/en/dispatcher/disp-config.html

我们还有称为 PUT 和 PATCH 的方法,它们也很有价值,但不是最适合实时场景。

补丁 :: https://www.rfc-editor.org/rfc/rfc5789

也是一个很好的讨论,你可以找到 PUT vs PATCH

Use of PUT vs PATCH methods in REST API real life scenarios

【讨论】:

以上是关于AEM:调用 Post servlet 时出现 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 JSP 表单调用 servlet 时出现 404 错误

解决web浏览器与servlet之间传输数据时出现的乱码问题

com.netflix.zuul.exception.ZuulException:当我调用 POST 方法调用时出现转发错误

通过 https 发送 POST 请求时出现 SSLHandshakeException

从泽西客户端调用 post API 时出现 415 错误

AEM 中 doFilter servlet 的调度程序白名单