2

对,我正在为不需要任何类型的用户注册或身份验证的网站构建订单。该表单具有三种模型:Order、OrderImage、Print。一个订单有很多 OrderImage,一个 OrderImage 有很多 Prints。

用户需要能够随订单上传图像(OrderImage),并且还需要能够在订单被确认和提交之前返回并编辑每个 OrderImage。

该表格是多步骤的,由四个阶段组成:

  1. 上传图片
  2. 审核上传
  3. 你的资料
  4. 确认上传

这很好,一切都按计划进行,并且随着用户输入更多详细信息或上传更多图像,数据在整个订单过程中存储到数据库中。

但是,这意味着存在诸如“/upload?order=5”之类的 URL,这是不好的。因为没有身份验证,这意味着任何人都可能猜测订单的 URL 并更改它。

所以我只是想知道管理这个过程的最佳方法是什么?我有几个想法,但不确定它们是否是解决问题的最佳方法:

  1. 例如,生成一个 6 位数以内的随机订单号,这样 url 就会更像:“/upload?order=645029”。这将导致有人猜测订单号的机会减少,但实际上仍然不是很安全。

  2. 将上述想法与订单上的状态相结合,例如“完成”。因此,当最终提交订单时,它被标记为完成。然后我可以防止再次访问任何“完成”订单。但是,在下单过程中,订单号仍然可以被猜测和篡改。

  3. 利用会话并将订单号存储在此处而不是 URL 中,或者作为表单中的隐藏值。

我看过 Ryan Bates 的关于多步表单的 Railscast,他在会话中存储数据。然而,Ryan 本人承认,以这种方式存储复杂的模型和对象是不切实际的。

因此,任何有关处理未经身份验证的订单的最佳方式的建议将不胜感激,谢谢。

4

2 回答 2

0

我会选择选项#3。你说得对,在session中存储复杂的对象不好,但你只需要存储订单的ID号,然后你可以在数据库中查找。您可以使用 abefore_filter来确保请求的订单属于当前用户:

class OrdersController < ApplicationController
  before_filter :check_ownership, :except => [:new, :create]

  private

  def check_ownership
    redirect_to '/' unless params[:id] == session[:current_order_id]
  end
end

此示例稍后可以轻松扩展,以允许拥有帐户的用户查看他们的订单历史记录(而不仅仅是当前订单)。选项#1 和#2 只是掩盖了问题,以后可能更难扩展。

于 2011-09-12T15:53:12.910 回答
0

我不想回答一个问题......但是:当用户稍后返回该站点时如何找到他的订单?

如果没有注册,您必须找到一种方法将用户与订单相关联!

我看不出你怎么能安全地做到这一点,至少问他一个唯一的用户名。

但是,任何人都可以猜出这个用户名并获得订单!

我会说,如果您不想进行身份验证......那么您不应该关心其他用户看到任何人的命令!

如果这是一个问题,您将需要一种简单的身份验证形式。

于 2011-09-12T15:35:11.113 回答