【问题标题】:How can I securely handle shipping rate options in my web app?如何在我的 Web 应用程序中安全地处理运费选项?
【发布时间】:2011-10-26 22:35:32
【问题描述】:

我从外部 API 请求运费并得到如下结果:

ground  : '$1'
express : '$5'

然后我将这些选项展示给用户,他们会从中选择一个。理想情况下,他们会提交一个代表他们选择的选项的 ID,我会查找相应的选项,但要查找它,我需要有一个存储的选项列表。我可以将选项列表存储在我的数据库中,但如果他们返回并更改地址或购物车中的商品,我将需要更新它。

这意味着我实际上是在缓存和重新缓存运输选项,这对于看似相对简单的任务来说似乎是很多开销。

有没有我忽略的更直接的方法来做到这一点?

【问题讨论】:

  • 为什么不将选项列表存储在$_SESSION 中?无论哪种方式,对我来说这听起来都不是那么大的开销。
  • @Jordan: $_SESSION?我认为您正在考虑 PHP。这是鲁比。如果是这种情况,您将使用session
  • 哈哈,谢谢瑞恩。绝对在这个上隔开。
  • 无论哪种方式,我都在使用 rails,但这是一个更通用的设计问题 :) 这是我要走的路,虽然我将它存储在 orders 表中,但是在会话中被引用。

标签: ruby-on-rails shipping


【解决方案1】:

为什么要存储它?根据 API 的响应动态生成表单/下拉列表,并将下拉列表的值设置为包含的不是 ID,而是美元汇率。然后,您在控制器中返回的参数是来自 API 的美元金额,并插入到表单中,而不是记录 ID。

假设运费不时变化,那么无论如何存储它是没有意义的。通常,这就是 API 的用途,因此您可以随时在需要时查找它。另一方面,给定订单的运费不太可能在用户会话期间发生变化。

为了在下方反映您的 cmets,您可以在下单时缓存运费、订单总重量和目的地地址。然后,仅当重量、订单中的商品或目的地地址发生变化时,才重新请求新的运费。

【讨论】:

  • 问题在于阻止某人操纵表单并发送 0 美元或 -100 美元的运费。我需要将其与某些东西进行比较,对吗?
  • 啊,很抱歉我错过了 - 当然你是对的。您可以使用运费 type 值而不是价格(即 1 = 标准运费,2 = 快递等)填充下拉菜单,然后在结帐时计算最终价格。将您支持的运输类型存储在您的数据库中。您可以通过 API 调用将价格插入下拉菜单,然后我想在最终计算期间进行第二次 API 调用。您可以缓存它以尝试节省 API 调用,但您需要设置缓存过期时间以帮助保持运输成本尽可能准确。
  • 将最终报价的运费存储在订单本身中,这样您在下订单时告诉客户的内容与实际从您的帐户中转出的时间之间不会有差异。如果您担心订单和实际发货之间的运输成本会上涨(并且您会赔钱),那么在每个订单的运输成本上增加一小部分(1-2%)以解决此类问题,或者只是吃成本。
  • 这基本上是我采用的解决方案。这样客户看到的和他们支付的肯定是一样的,他们不能篡改数据。我缓存了报价的运费以及订单的重量和收货地址。如果权重或地址发生变化,则重新请求速率,否则使用缓存。如果您想更新您的答案,我会选中它,除非其他人有一个绝妙的主意:)
猜你喜欢
  • 2010-12-19
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2012-06-14
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多