ruby-on-rails - 将敏感和较短的数据传递到外部链接
问题描述
我最近想开始在我的网站中实现 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>
欢迎任何见解,但现在我真的对如何解决这个问题一无所知,因为我已经用尽了我所学到的一切。
解决方案
我对您的 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
方法将其转换为查询字符串。
推荐阅读
- excel - 如何将一个驱动器(excel)中的图像上传到 Power 应用程序?
- javascript - 为什么这个小库函数返回未定义?
- flutter - 如何使用颤振编辑pdf?
- python - 选择性地禁用继承的成员
- google-forms - 谷歌形成多项选择网格:添加“其他”选项
- amazon-cloudformation - 如果帐号为 XXXXXX,则取消 VPC 配置
- ssl - certbot 生成 ssl 证书的问题
- node.js - 在独立 nodejs 脚本中访问 serverless.yaml 中定义的环境配置
- python - 在文件中写入行后如何在文件顶部写入行数?
- javascript - 对人类隐藏元素,但对机器人隐藏