2010-01-06 123 views
0

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

+0

你能解释一下你为什么要这样做吗? – 2010-01-06 21:18:04

+0

@Jordan:看看我对Andrzej Doyle的回答的回答 – 2010-01-06 21:33:17

回答

1

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

尽管可能出现假阳性。有时Referer没有设置。

+0

我假设你需要在每个加载到该框架的页面内执行此操作,并且可以使用php来完成此操作?并感谢你最终没有对我进行检查输入和所有这些。所有其他的答案都没有考虑到这个事实,我说输入已经过了消毒处理,我只是试图让一般的joe主要用户不会玩弄它。他们将无法访问他们提及的任何工具! – 2010-01-06 21:11:47

+0

是的,为每个页面。我建议一个PHP包含来完成这项工作。标头的值为 $ _SERVER ['HTTP_REFERER'] – 2010-01-06 21:51:06

+0

谢谢。你的第二个评论是我正在寻找的! – 2010-01-07 04:57:11

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是一种统一资源定位符,与您在该页面上提供的内容相对应。如果有人在某一天访问该地址并看到有用的资源,为什么他们回去时不能再看到它?我强烈建议你考虑一下为什么你想故意阻碍用户的体验,并且违背互联网通常与你的网站一起工作的方式。

+0

我试图这样做的原因是因为他们希望Intranet的设计使用框架,以便最终用户只能看到地址栏中的主页(/index.html),而不管他们在哪个页面上。但我不希望用户能够“查看页面源代码”查看他们想要的内容在“/other_page.html”,只需在地址栏 – 2010-01-06 21:28:49

+0

中输入该内容,并且无法回到该地址栏另一天。这是只有经过域认证的用户可访问的内部网。用户只能使用地址栏篡改传递给页面的数据,所以我相信为了简单起见,获取此功能将阻止人们使用这些有限工具在站点周围窥探 – 2010-01-06 21:31:36

+1

如果您只关心是否希望他们请将URL看作/index.html最简单的方法是使用apache的mod_rewrite – eCaroth 2010-01-06 21:56:48