将敏感且较短的数据传递到外部链接上

时间:2019-02-21 04:34:50

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

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

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

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

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

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

然后,我发现link_to帮助程序可以发送参数,但是在进行一些测试后,它不起作用,然后我发现将参数发送到带有rails的外部站点,建议的方法是将参数连接到url中,所以我回来了整圈。

所以我的问题是,如何将参数发送到外部网站(最好在使所有信息尽可能安全的同时),而无需在Rails中使用表单(因为所有信息以前已经用以前的表单填写了) ?

虽然我之前曾经使用过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>

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

1 个答案:

答案 0 :(得分: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