Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在rails中限制对页面的访问,除非用户通过从特定页面的链接到达?_Javascript_Ruby On Rails - Fatal编程技术网

Javascript 如何在rails中限制对页面的访问,除非用户通过从特定页面的链接到达?

Javascript 如何在rails中限制对页面的访问,除非用户通过从特定页面的链接到达?,javascript,ruby-on-rails,Javascript,Ruby On Rails,我正在用Rails做一个基于计算机的在线测试。每个问题都有一个表单/questions/的页面URL。 每个问题页面上都有一个“下一步”按钮,指向下一个问题,如/questions/。我不希望用户能够手动键入任何问题的URL并转到该页面。 有什么方法可以做到这一点,最好是服务器端解决方案。我有一个服务器端解决方案可以解决您的问题,如下所述 假设您有一个用户可以启动测试的固定链接 一旦用户开始测试,然后将问题id添加到会话中,如下所示 会话[:当前问题id]=参数[:问题id] 始终检查下一个问题

我正在用Rails做一个基于计算机的在线测试。每个问题都有一个表单/questions/的页面URL。 每个问题页面上都有一个“下一步”按钮,指向下一个问题,如/questions/。我不希望用户能够手动键入任何问题的URL并转到该页面。
有什么方法可以做到这一点,最好是服务器端解决方案。

我有一个服务器端解决方案可以解决您的问题,如下所述

假设您有一个用户可以启动测试的固定链接

一旦用户开始测试,然后将问题id添加到会话中,如下所示

会话[:当前问题id]=参数[:问题id]

始终检查下一个问题id,将其增加到session问题id,如果匹配,则显示问题或不执行任何操作重定向到back

如果你有像1,2,3…n这样的问题序列,那么这个解决方案会起作用。

你可以使用:


,这将把您的ID转换为slug,这样最终用户就无法确定到底是什么传入了URL参数。

有点像Bharat Soni:

您可以使用通过组合问题id和链接到用户会话的随机数而生成的id来构建url

您可以使用SHA1或您选择的算法组合这两个值。例如:

问题编号:123

秘密会话哈希:857c9e05-8ad0-4d6b-8112-5f442a731dc1 SecureRandom.uuid on sessionCreate

计算您的摘要:

摘要::SHA1.hexdigest{question_id}{secret_session_hash}

=>e951774237433335a6c9c0928d5691ca0c2a31b5

构建您的url:

网站/question/123?key=e951774237433335a6c9c0928d5691ca0c2a31b5

您必须在控制器中确保在params[:key]中接收的摘要与您计算的摘要相同


通过这种方式,您可以合理地确保您的用户没有作弊,并且他不能将url提供给另一个人。

作为一种简单但不是非常安全的解决方案,您是否可以让“下一步”按钮提交一个可能为空的表单,并且只允许/questions/id路径在POST中可用,而不允许获取?这样键入URL将不起作用,因为它将导致GET请求。