限制只能从某个页面访问页面

时间:2010-01-06 20:58:07

标签: php javascript apache intranet frameset

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

2 个答案:

答案 0 :(得分:4)

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

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

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

(如果没有服务器端会话,您可以尝试通过客户端会话cookie实现此目的,或者检查引用者标​​题,但是对于客户来说这很简单,因为这些只是他们发送给您的字符串而您接受他们的为它而言)。

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

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


但是现在是时候退后一步说 - 为什么你想这样做吗?我认为没有任何理由可以做到这一点。 这不是一个合适的安全措施 - 您需要正确地执行安全措施,如果这是您的动机,您应该要求它。这对于访问者来说也不是一种强制执行特定工作流程的好方法 - 这是否是一个好主意是有争议的,但不是考虑如何强迫人们在页面B之前转到页面A,而是考虑完全< / em>为什么你需要他们这样做,你的限制因素是什么,以及实现它们的最不具侵入性的方式。

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

答案 1 :(得分:1)

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

虽然可能出现误报。有时Referer没有设置。