代码之家  ›  专栏  ›  技术社区  ›  MattSlay

使用隐藏字段托管子记录的外键数据?

  •  0
  • MattSlay  · 技术社区  · 16 年前

    但是,如果您查看在浏览器中呈现的页面源代码,您可以看到隐藏字段和值,这使我怀疑这是否是一种危险的技术,以防有人试图在其原始html内容发回之前对其进行欺骗。我个人不知道如何用这种方法破解网页,但我听说这是可以做到的。

    3 回复  |  直到 15 年前
        1
  •  3
  •   vonconrad    16 年前

    你问题的答案归结为你所担心的。您是要防止用户错误,还是要防止恶意使用?

    project_id 在一个隐藏的形式领域构成了非常小的危险。你的用户不太可能看到它,更不可能关心它。

    如果你试图阻止恶意使用,问题就更大了——但这又取决于你试图阻止什么。

    如果您试图阻止用户将任务添加到他们无权访问的项目中,请使用某种权限系统来禁止用户访问某些项目。最简单的方法就是在用户和项目之间建立关系,然后使用 current_user.projects.find(params[:project_id]).tasks.create (或类似的)在你的控制器里。

    现在,如果您绝对地、肯定地不希望用户将任务添加到任何其他项目(period),您可以考虑预先创建任务。基本上,您可以在 new 操作并将用户重定向到编辑操作。像这样:

    def new
      @project = Project.find(1) # Or however you want to fetch the project
      @task = @project.tasks.create
      redirect_to edit_project_task(@project, @task) # May vary depending on your routes
    end
    

    使用这种方法,您可能希望删除 create

        2
  •  1
  •   PeterWong    16 年前

    在我的实践中,我宁愿将项目id嵌入到url中(通过使用资源丰富的路由)

    /project/:project_id/task

    事实上,我不会相信大多数从表格中恢复过来的东西(假设有人构建了自己的代理服务器,因此可以将表单的数据修改为其他任何内容!)

    所以我只要确认我有我的东西,那就没事了。我不介意这是怎么回事 :project_id :项目id 并且用户有权处理找到的项目。

        3
  •  0
  •   Eimantas    16 年前

    当您使用父/子(项目/任务)时,应该使用restfulurl作为它们的crud接口。当您为项目创建任务时,您可以专门发布到该项目的任务创建url。路线应该是这样的:

    resources :projects do
      resources :tasks
    end
    

    当你定义 new_project_task_path(@project) /projects/1/tasks/new 哪里 1 将是项目的id。那么在控制者行动中你应该这样做:

    def create
      Project.find(params[:project_id]).tasks.create(params[:task])
    end
    

    一切都会为你做的。如果要将任务添加到属于特定用户的项目中,请执行以下操作:

    def create
      current_user.projects.find(params[:project_id]).tasks.create(params[:task])
    end
    

    before_filter 为您找到项目并将其放入 @project 实例变量。