【问题标题】:Prevent direct access to url防止直接访问 url
【发布时间】:2014-04-13 13:02:20
【问题描述】:

我知道这个问题已经被问过很多次了,但我还是迷路了!

我有一个在 Apache 服务器内部托管的网站项目 (php)。该网站与主页一起加载。主页包含一个login 链接。当用户单击login 时,.htm 页面将在一个单独的选项卡中打开,该选项卡托管在 IIS 中的另一台服务器(外包)上。我想防止用户直接在地址栏中输入login页面的URL。相反,用户应该始终通过项目主页导航到login 页面。

我理解的唯一解决方法是通过htaccess 文件。当页面在同一台服务器上时,这有效。但是,在 IIS 上没有 htaccess 文件。

另一个解决方案是在单击login 时执行http post variable。如果变量存在(通过主页访问),则应加载登录页面,否则应将用户重定向到主页(如果直接输入登录 URL)。但是,我可以发布一个变量,但我不明白在哪里进行调用以加载适当的页面。以下用于发布变量:

<ul>
<li><form id="loginForm" name="loginForm" method="post" action="redirectTest.php">
<input type="hidden" name="total" id="total" value="">
<a href="#" onclick="setValue();">Login</a>
</form></li>

<script type="text/javascript">
function setValue(){
    document.sampleForm.total.value = 100;
    document.forms["loginForm"].submit();
}
</script>

redirectTest.php 目前为空,因为我不确定如何进行相应的重定向。

编辑:例如,我的网站是 www.abc.com,登录页面是 www.xyz.com/login.htm。如何判断是通过 www.abc.com 路由还是直接输入地址栏的 URL?

【问题讨论】:

  • 什么是“.htm 页面”?
  • 如果我正确理解您的问题,使用后置变量的方法不是可靠的预防策略。只是因为它很容易被伪造。如果我没看错,如果请求不携带来自您的其他站点的引用标头,您希望阻止访问该 IIS http 服务器提供的单个“页面”。如果是这样,那么当请求提供“登录页面”时,您必须在 IIS http 服务器上测试该标头。如果设置了标头,则可以,如果没有,则阻止访问或将重定向标头返回到该其他站点。
  • @arkascha 出于兼容性目的,html 也缩写为 htm。关于test for that header on the IIS http server when it is requested to deliver the "login page",能否请您解释一下这个header 的位置以及要进行什么样的验证测试?
  • 这是一个普通的http头浏览器在跟随链接而不是加载直接输入的url时添加到请求中。它被记录在案。它包含保存链接的页面的 url,即“用户来自的页面”。它作为服务器端请求的一部分提供,PHP 在其$_SERVER 超全局变量中提供它作为元素HTTP_REFERRER,这也被记录在案。它也可以由 http 服务器本身进行评估,尽管我无法帮助您。就像这里可能 99% 的使用一样,我对 IIS 的经验非常有限,它只是一个罕见的、异国情调的 http 服务器。

标签: php apache .htaccess iis redirect


【解决方案1】:

在登录页面,您可以使用变量$_SERVER['HTTP_REFERER']。这将包含您单击链接的页面的名称。然后,您可以在 if 语句中使用它,如下所示:

if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "http://domain.com/page_with_login_link.php")

在javascript中,可以通过document.referer访问http referer

【讨论】:

  • login 页面在 htm 中,我不能在其中使用 php 标记。
  • @Sarah 你可以尝试用javascript来做,看看我更新的答案
  • 谢谢,现在很清楚了。但是我的问题-当从my 站点单击login 时,加载的login 页面不以my 站点为前缀。例如,我的网站是www.abc.com,登录页面是www.xyz.com/login.htm。上面的js如何识别这个路由是通过www.abc.com还是直接输入地址栏的URL?
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多