美文网首页SAP
深入介绍 SAP OData CSRF Token 的一些技术细

深入介绍 SAP OData CSRF Token 的一些技术细

作者: _扫地僧_ | 来源:发表于2024-07-24 14:06 被阅读0次

    笔者在过去 17 年的工作里一直深耕 SAP 技术领域,我运营了一个 500 人的技术交流群,里面讨论气氛很浓。

    这不,昨晚将近凌晨时,还有朋友提问,讨论 OData 里 CSRF Token 有效期的话题。

    本文就来聊聊 SAP OData CSRF Token.

    阅读目录:

    1. 什么是 CSRF Token?
    2. SAP 标准 Fiori 应用是如何请求 CSRF Token 的?
    3. 一个 CSRF Token 能否在多次请求里重复使用?
    4. CSRF Token 的有效期是多久?

    01. 什么是 CSRF Token?

    跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是一种网络攻击手段,它允许攻击者伪造用户的身份来执行未经授权的操作。

    为了防止 CSRF 攻击,常用的一种技术手段就是 CSRF Token.

    CSRF Token 是一种随机生成的防伪 Token,它由服务器颁发给客户端,并需要客户端在提交某些特定类型的请求时,将该 Token 添加到 HTTP 请求的头部字段去。

    服务器验证收到的 CSRF Token 是否与用户会话中保存的 Token 匹配,以确保请求是由合法用户发出,而非由攻击者伪造。Token 的随机性使得攻击者无法轻易预测和伪造。

    02. SAP 标准 Fiori 应用是如何请求 CSRF Token 的?

    我们来观察 SAP 标准的 Fiori 应用里是如何操纵 CSRF Token 的。

    进入 Fiori Launchpad,打开 SAP CRM My Opportunities 应用的 tile.

    一旦进入到 Master-Detail 页面,就会观察到一个 HTTP 请求,在该请求的头部字段集合里,有一个名叫 X-Csrf-Token 的字段,值为 Fetch.

    该请求的目的就是向服务器端请求一个合法的 CSRF Token.

    服务器颁发的 CSRF Token,通过 HTTP 响应的头部字段 X-Csrf-Token,返回给 Fiori 应用。

    我们记住这个 Token 值,以 sg== 结尾。

    如果想知道为什么 SAP Fiori 应用会发起这个 Fetch Token 的请求,可以把鼠标放在这个 HTTP 请求的 Initiator 列的超链接上。

    接下来会自动弹出一个类似 ABAP 调试器里的 Callstack 对话框。

    从这个调用栈列表,我们能清楚地看到,在 SAP UI5 ODataModel 一个名叫 _submit 私有方法的内部,会调用另一个名叫 updateSecurityToken 的方法。

    这个方法里的注释写明,当 SAP Fiori 应用触发了会对系统数据进行修改的写操作,以及 Batch 请求时,在提交这些请求之前,必须更新 CSRF Token.

    03. 一个 CSRF Token 能否在多次请求里重复使用?

    那么回到技术交流群里朋友的提问:一个 CSRF Token 能否在多次请求里重复使用?

    这个问题实际动手操作一下就知道答案了。

    我打开 SAP CRM My Opportunities 应用,将一个 Opportunity 切换到编辑模式,将其描述字段值,从 test 改成 test2,观察自动生成的 HTTP 请求:

    下图图例1 展示的是 HTTP Batch 请求里包含的 MERGE 操作,图例2 包含了 MERGE 操作的 Payload,即待修改的 Description 字段的最新值为 test2, 图例 3 就是传入的 CSRF Token 值,也就是刚刚通过 updateSecurityToken 获取到的 Token 值。

    保存成功后,再将 Description 从 test2 改成 test3,观察到 Batch 请求里,HTTP 头部的 x-csrf-token 值,仍然使用的是之前的 Token.

    这说明 CSRF Token 在某一时间间隔内,可以重复使用。

    04. CSRF Token 的有效期到底是多久?

    笔者之前另一篇介绍 SAP Commerce Cloud UI 的用户会话管理
    的文章里曾经提到,SAP 电商云基于 OAuth 的 API,其 Access Token 的过期时间允许自定义配置,且在服务器颁发 Token 给客户端时,会将过期时间的时间戳,同 Token 本身一并返回。

    我们单步调试 /IWCOR/CL_REST_HTTP_HANDLER~HANDLE_CSRF_TOKEN 方法,发现这个方法里有个 IF 分支,如果检测到 HTTP 请求头部字段值,和 CSRF Token 相关的操作是 Fetch,就调用 get_csrf_token 方法,给请求者颁发一个 Token.

    下图就是 ABAP 服务器颁发 Token 的实现机制,从方法 get_current_session_context 可以看出,CSRF Token 是隶属于服务器会话上下文(Session Context)实例的一个属性。

    在 SAP 官方帮助文档里的文字解释,也印证了上面的源代码:

    CSRF Token 依赖于服务器安全会话,其有效期通过 RZ11 事务码里的配置参数 http/security_session_timeout 来指定。

    在笔者的系统上,默认值为 1800 秒即 30 分钟。

    系统里关于这个参数的帮助文档:

    简单翻译了一下:

    该参数定义了在收到两个 HTTP 请求之间最大的间隔时间。如果超过这个时间间隔,所有在当前应用服务器上,与安全会话相关联的应用上下文,都会自动关闭同时释放相关资源。

    如果安全会话在其他应用服务器上也不再被使用,则安全会话本身也将关闭。

    对于需要身份认证的 Web 应用和服务来说,此后接收到的所有 HTTP 请求,在提供实际的服务响应之前,都会触发身份验证请求。

    总结

    本文回答了笔者技术交流群里一个朋友的提问,要点如下。

    1. SAP Fiori 标准应用,在执行写操作和发送 Batch 请求时,会自动向服务器端请求 CSRF Token.

    2. 一个 CSRF Token 可以在超时时间到来之前,多次重复使用。

    3. CSRF Token 是服务器端安全会话实例的一个属性,超时时间间隔,可以由管理员,通过 RZ11 事务码进行配置。

    更多阅读

    相关文章

      网友评论

        本文标题:深入介绍 SAP OData CSRF Token 的一些技术细

        本文链接:https://www.haomeiwen.com/subject/ifayhjtx.html