0

这个问题类似于我在这里问的问题。但它是相关的,因为我想达到同样的效果。我希望用户只能通过主页访问网站上的其他页面。第一个页面包含一个用于导航的框架,然后是一个用于导航到的页面内容的框架。我希望对其进行设置,以便他们访问内容页面的唯一方法是使用此主页。因此,如果主页是http://intranet/index.html ,那么如果不使用 index.html 中提供的链接,他们就无法访问http://intranet/other_page.html 。这可能吗?如果可以,最好的技术是什么?我正在使用 apache 为网站提供服务,并且我有 php 和 javascript 可用。

4

2 回答 2

4

这个简短的回答是——不,严格来说不可能。

长答案是,是的,您可能会想出一个合理的近似值,但您确实需要了解这些限制。

从根本上说,HTTP 是无状态的。无论发生什么特定操作,您的网络服务器都会看到一个请求,/other_page.html并且需要决定是否提供它。为了有某种合理的限制,第一步是必须有某种方式来维护服务器端状态。如果没有这个,您将无法将 other_page.html 的任何传入请求与之前的请求相匹配。好消息是 PHP 确实有对服务器端会话的原生支持。

(如果没有服务器端会话,您可以尝试使用客户端会话 cookie 或检查引荐来源标头来实现此目的,但是客户端伪造这些只是他们发送给您的字符串并且您接受他们的话,因此伪造它是微不足道的)。

现在,您需要使用此会话来跟踪用户在转到另一个页面之前是否已经到过第一页 - 您可以在请求第一页时在会话中设置一个变量,并在每次请求 /other_page 时设置一个变量.html,请确保在提供此变量之前在会话中设置此变量。这至少给了你一个合理的想法,即他们已经访问了当前会话的第一页。

但是,您绝对无法知道在浏览器中单击了哪个链接来请求特定的 URL - 甚至根本不知道是否涉及浏览器。您的服务器看到的只是对特定资源的请求以及一些标头。一种可能模拟这种情况的方法是在提供时生成一个随机字符串/index.html,并将其作为查询参数添加到该页面上的链接。然后将其存储在会话中,并在询问 other_page 时检查请求是否包含具有相同随机字符串的查询参数。


但在这一点上,是时候退一步说——你为什么要这样做?我完全想不出为什么要这样做。 这不是一个合适的安全措施——你需要正确地做安全,如果这是你的动机,你应该要求它。这也不是对访问者强制执行特定工作流程的好方法——这是否是一个好主意还有待商榷,但与其考虑如何强迫人们在页面 B 之前转到页面 A,不如想想为什么它是你需要他们这样做,您的限制因素是什么,以及实现这些限制的最少侵入方式是什么。

不要忘记 - http://intranet/other_page.html是一个统一资源定位器,它对应于您从该页面提供的内容。如果有人有一天访问了那个地址并看到了一个有用的资源,为什么他们回去后不被允许再次看到它呢?我强烈建议您考虑一下为什么要故意限制用户的体验,并在您的网站上违背互联网的一般运作方式。

于 2010-01-06T21:13:49.930 回答
1

检查 Referer 请求标头 - 它会阻止临时用户使用他们的浏览器。但它可以被欺骗 - 你不会欺骗一个坚定的攻击者。

不过,误报是可能的。有时没有设置Referer。

于 2010-01-06T21:02:39.347 回答