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 中引入以对来自浏览器的 POST
、PUT
和 DELETE
请求针对 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 方法调用时出现转发错误