【问题标题】:Passing sensitive and shorter data onto external links将敏感和较短的数据传递到外部链接
【发布时间】:2019-02-21 04:34:50
【问题描述】:

我最近想开始在我的网站中实现 API,但由于我缺乏关于如何使用 Ruby on Rails 正确发送 JSON 数据的知识,我遇到了一些关于验证的问题。我过去曾使用过一些 API 和 JSON,但这是我第一次同时使用这两种方法,而且我在 RoR 方面的经验仍然不足。

我的第一直觉是将参数连接到 url 上,在看到来自 API 的更积极(尽管仍然不完整)的 JSON 响应后,我认为我走在正确的轨道上,但在未能获得成功的响应后,我开始深入研究我发送的确切内容,那时我发现了两个问题。

第一个问题是 URL 中包含敏感信息,例如我的 clientID,有关购买的信息,例如价格和描述,以及使用 MD5 和一些加密盐加密的密钥,但根据文档,它是安全且只是为了与服务器收到的信息进行比较,所以总的来说我不太担心会泄露那种信息。我仍然想改进我的代码并尽可能多地保护信息。

我的第二个问题更严重,我注意到发送的信息不完整,由于 url 参数中的空间有限。

就在那时我知道我做错了,所以我开始寻找替代方案,最好是使用 POST 响应,但是我仍然缺乏关于如何使用 POST 正确发送参数的知识,并且在我尝试时信息仍然存在使用表单,更糟糕的是,与我之前的尝试不同,我发送的参数在另一端似乎是空的,所以我开始深入研究它。

然后我发现link_to帮助器可以发送参数,但是经过一些测试它不起作用然后我发现用rails向外部站点发送参数,建议的方法是将参数连接到url中,于是我原路返回。

所以我的问题是,如何在没有表单的情况下将参数发送到外部网站(最好同时保持所有信息尽可能安全)(因为所有信息之前都已在之前的表单中填写过) ?

虽然我之前使用过 API 和 JSON,但它们仍然是我不太习惯使用它们的主题,并且在某种程度上我仍然在 RoR 中学到了很多东西。

这是给我带来最多结果的代码(真实的看起来有点不同):

我的控制器order_controller.rb

def confirm_order

  #Here I group all the parameters I'll need

  @payment_params = []
  description = "create_"+ @order.name.gsub(' ','_')
  device_info = "WEB"
  currency = @order.currency
  fee =  @order.price
  #this was to concatenate the url, previouly I had the name of each parameter and the "&" taken into account, the response was different as I added each.
  @payment_params << description << device_info << currency << fee
end

在我看来confirm_order.html.erb类似于

<a href= <%="https://payexample/something/order?"+ @payment_params%> >Confirm order</a>

欢迎任何见解,但现在我真的不知道如何解决这个问题,因为我已经用尽了我所学到的一切。

【问题讨论】:

  • 如果你想做一个帖子,你应该构建一个表单,或者转向一种 Javascript 方法,在这种方法中,你可以捕获链接点击并将请求转换为帖子请求,例如通过 Ajax .
  • 不确定您是否担心安全性,也许github.com/jwt/ruby-jwt 会有所帮助。您可以使用编码后的令牌作为参数,有效负载可以是任意长的。唯一的缺点是接收者必须解码令牌才能看到参数。

标签: ruby-on-rails json ruby external-url


【解决方案1】:

我对您的 UI 看起来有些困惑,但我会将所有这些信息保留在链接之外,并确保在 POST 中进行确认(因为某些浏览器会预加载可能导致意外购买的链接如果您将其保留为链接)。我会改为使用 button_to 助手。

我不确定您是如何跟踪订单的,无论是在数据库中还是在会话中还是在什么地方。所以你可能需要稍微修改一下才能传递正确的参数。

https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

<%= button_to('Confirm order', action: 'confirm_order') %>

然后在您的confirm_order 操作中,您可以重定向到支付网站,而不是一直将所有机密信息放在页面上。如果有人正在查看网络流量,他们会很快在标题中看到它,但它不太容易发现,并且页面上的链接可以在新标签页中多次打开。

def confirm_order
  #Here I group all the parameters I'll need

  @payment_params = []
  description = "create_"+ @order.name.gsub(' ','_')
  device_info = "WEB"
  currency = @order.currency
  fee =  @order.price
  #this was to concatenate the url, previouly I had the name of each parameter and the "&" taken into account, the response was different as I added each.
  @payment_params << description << device_info << currency << fee

  redirect_to("https://payexample/something/order?#{@payment_params}")
end

我不确定您希望该重定向网址是什么。这取决于外部站点。如果你需要它作为查询字符串参数,你可以做一个键和值的哈希,并使用to_query方法将它变成一个查询字符串。

https://apidock.com/rails/Hash/to_query

【讨论】:

  • 这正是我所需要的,我仍然忘记了控制器可以并且应该执行此类请求,即使那时我也不知道我可以将 redirect_to 用于外部站点,我一直在使用它重定向到一个动作。
  • 啊,是的!您可以重定向到任何地方。如果参数是 Hash,Rails 将使用路由器来构建 url。如果它是一个字符串,它将按原样重定向。还有一些其他很酷的选项,例如调用 redirect_to 并给它一个 ActiveRecord 对象作为参数,或者使用命名路由之一。我建议您阅读此文档以及有关 url_for 的文档(redirect_to 用于构建 URL)。我想你会发现它很有帮助。 apidock.com/rails/ActionController/Redirecting/redirect_to
猜你喜欢
  • 2020-07-07
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2020-04-25
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多