繁体   English   中英

无需身份验证的安全Rails 3 MultiStep订单的最佳方法

[英]Best approach for a secure Rails 3 MultiStep Order Form without authentication

是的,我为不需要任何用户注册或身份验证的网站建立了订单表。 该表单具有三个模型:Order,OrderImage,Print。 订单中有许多OrderImage,而OrderImage中有许多印刷品。

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

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

  1. 上传图片
  2. 查看上传
  3. 你的资料
  4. 确认上传

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

但是,这意味着存在URL,例如“ / upload?order = 5”,这不是很好。 因为没有身份验证,这意味着任何人都可以潜在地猜测订单的URL并进行更改。

因此,我只是想知道管理此过程的最佳方法是什么? 我有几个想法,但是不确定其中是否有解决问题的最佳方法:

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

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

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

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

因此,非常感谢您提供有关处理未经身份验证的订单的最佳方法的任何建议。

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

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

我看不到您如何安全地执行此操作,至少要问他唯一的用户名。

但是之后,任何人都可以猜测该用户名并获得订单!

我想说的是,如果您不想进行身份验证...那么您就不必在意其他用户看到任何人的命令!

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

我会选择#3。 没错,在会话中存储复杂的对象不是很好,但是您需要存储的只是订单的ID号,然后可以在数据库中查找它。 您可以使用before_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仅掩盖了问题,以后可能很难扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM