首页 > 解决方案 > 将敏感和较短的数据传递到外部链接

问题描述

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

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

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

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

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

然后我发现link_to helper可以发送参数,但是经过一些测试它不起作用然后我发现用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>

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

标签: ruby-on-railsjsonrubyexternal-url

解决方案


我对您的 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

我不确定您希望该重定向 url 是什么。这取决于外部站点。如果您需要它作为查询字符串参数,您可以对键和值进行哈希处理,然后使用该to_query方法将其转换为查询字符串。

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


推荐阅读