【问题标题】:How to differentiate b/w the REST API calls made from UI client and REST Client如何区分从 UI 客户端和 REST 客户端发出的 REST API 调用
【发布时间】:2018-04-15 09:51:50
【问题描述】:

我的应用程序中公开了一堆 REST API。我需要区分来自 UI 客户端的调用(用户单击按钮或提交表单)和来自网络的调用。例如,在 mozilla 浏览器中,用户可以打开网络选项卡并使用不同的参数调用 API(只要用户仍然登录并在同一个会话中)。无论如何,我们是否可以检查 API 实现是来自 UI 客户端还是仅来自 REST 客户端?提前致谢。

【问题讨论】:

  • 您可以在客户端请求中添加 HTTP 标头。
  • 不要认为这会有所帮助,因为当用户通过浏览器重新发送按钮发送请求时会传递相同的标头
  • 所以?您所要求的只是区分 UI/浏览器和 REST 客户端
  • 是的,没错

标签: rest api


【解决方案1】:

HTTP 客户端可以通过 User-Agent 请求标头提供有关自己的信息。

RFC-1945: HTTP - User Agent

非浏览器客户端可以在执行 REST 请求时将自己的标识符/信息设置为 User-Agent 请求标头,从而允许服务器根据消费用户代理提供定制的内容。

【讨论】:

  • 不能修改任何请求来执行此操作吗?
  • @RobertBain:是的,当然,任何客户端都可以任意设置或伪造该标头。见:en.wikipedia.org/wiki/User_agent#User_agent_spoofing
  • 我检查了用户代理标头。再次,当我从浏览器重新发送请求时,它正在复制从 UI 客户端传递的所有标头。用户代理:Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
  • 我想知道请求来自哪里是多么重要。我想如果你有一个公共的 REST API,你会根据登录数据知道谁是谁,并且他们已经足够信任以获取访问权限。我无法想象会有很多攻击媒介通过伪装成 UI 调用来激怒人们,事实上,他们怎么知道要添加哪些标头。
  • @SBB 我看到的问题是 REST 请求对先前的请求一无所知。也许您可以为用户分配角色。有一个网络用户和一个 UI 用户,并且只让他们执行某些操作?
【解决方案2】:

没有办法区分。一旦用户通过身份验证,他们就有一个会话,可以调用他们被授权的服务并传递资源接受的任何参数。

如果我们假设没有人故意从 REST 客户端伪造它,那么在 UI 请求中添加数据以表明它来自 UI 是可行的,但邪恶的 REST 客户端可以发送相同的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2015-11-29
    • 2019-11-25
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多