繁体   English   中英

如何防止用户通过写入 URL 直接访问我的 html 页面?

[英]How to prevent a user from directly accessing my html page by writing URL?

我想要一个硬编码的登录页面( login.html ),没有数据库。 如果一个人写了正确的用户名和密码,它会重定向到 ( page2.html )。

现在我的问题是,如果一个人直接为 page2.html 编写 URL,他将能够访问它,而无需任何登录。

理想案例=> www.example.com/login.html => 如果正确 => www.example.com/page2.html

问题案例=> www.example.com/page2.html => page2.html ,没有登录 :(

您可以使用这样的 php 会话来控制这一切

  //set the session on the login page
   $_SESSION['loggedIn'] = true;  

 //on the second page you check if that session is true, else redirect to the login page  
  if($_SESSION['loggedIn'])
      //allow
  else
      //redirect to the login page
      header('Location: /login.html');  

会话是一种存储信息(在变量中)以跨多个页面使用的方式。 默认情况下,会话变量持续到用户关闭浏览器。

为简单起见,您可以将页面更改为php (例如login.php )。

  • 第 1 行:在您的login.php页面中,您将首先检查用户名和密码是否正确,如果正确,则设置$_SESSION['loggedIn'] = true

  • 第 2 行:在您的第二页 ( page2.php ) 中,您将首先通过检查会话是否具有值来检查用户是否登录if($_SESSION['loggedIn']) {//allow processing}

  • 第 3 行:如果该会话变量为空,则表示用户没有登录,将他重定向到登录页面else { header('Location:/login.php');}

首先:我不知道您想如何将密码和用户名与某些内容进行比较并检查它是否正确,但现在我会做这样的事情(同样,这是没有数据库的)。

您有 2 个选择:要么使用上述会话,要么使用更简单的方法:只需使用isset()函数。

<form action="page2.php" method="POST">
  <input type="text" name="userName" required>
  <input type="password" name="password" required>
  <button type="submit" name="submit">Send!</button>
</form>

page2.php 将包含下一个代码:

if(!isset($_POST['submit']) {
  //direct back to a certain page, could look like this:
  header('Location: xxx.php');
  exit();
  //exit() prevents the code from running, it litterly EXITS the code as soon as it hits that line.
} else {
  //direct to page2.php
}

让我们分解一下:为什么我使用扩展名.php 因为你不能纯粹用 HTML 来做到这一点。

为什么我使用(!isset())而不是isset() 因为好的做法是首先考虑安全问题,所以不要进入重要区域,然后检查某人是否拥有致命武器。 您先检查,然后允许他进入或拒绝访问。 这是防止某人使用 URL 访问您的页面的一种非常简单且常见的方法,但是 SESSION 更好,并且是一种更有经验的做法。

这个问题不能用纯 HTML 解决方案来解决。 您的问题被标记为 php,因此我的回答将基于此:

  1. 将您的表单发布到 php 脚本(例如 login.php)
  2. 脚本检查登录详细信息并设置 cookie
  3. page2.html 必须改为 php,并在显示 HTML 之前检查 cookie

另一种选择是使用 HTTP 身份验证,请参阅本文以获取教程。

您可以在服务器安全设置中阻止从外部位置访问该页面,然后在成功登录时使用fil_get_contents('page2.htm')在 php 中将该页面的 html 发送到浏览器。 php 在服务器上运行,因此文件请求不会来自外部源。 您可以使用 javascript 覆盖页面上的 html,或者您可以在 php 中的ifecho显内容,这将在else上显示正常页面

例如

if(isset($_GET['Login'])
{
    //check login details
    //if(....) //put your login check logic here
    {
        echo file_get_contents('page2.html');
    }
    else
    {
        //normal page's code goes here
    }
}

注意:如何将文件设置为禁止外部访问超出了我的回答范围

我遇到了同样的问题,发现这个问题并且它工作得很好:(在 javascript 中)只需将它放在文档的顶部。

var x = document.referrer;    

if (x == "page2.html") {
    console.log(x);
} else {
    window.location.href = "login.html";
};

使用 login.php 的完整路径更改您网站的默认路径。 下次当任何用户输入您的 url 时,他们将被重定向到给定的路径,即 yourpath>login.php

希望它会有所帮助。

如果您使用的是 Asp.net,也许您可​​以使用 TempData。 他们停留在页面之间的会话中。

if (/*username and password are correct*/){
    TempData["LoggedIn"] = "True";
} else {
    TempData["LoggedIn"] = "False";
}

然后,当您的控制器尝试加载 page2 时,您只需检查 TempData 的值。

var validate = TempData.Peek("LoggedIn");
if (validate == null || validate.ToString() == "False"){
    return RedirectToAction("login");
} else {
    /*allow access to page*/
}

使用 .Peek 会保留 TempData,因为如果它被访问,它通常会被标记为删除。 您还想检查它是否为空,因为如果用户没有首先浏览登录页面,它可能从未被分配过。

您可以通过检查用户是否已经登录来防止这种情况发生

// If the user is not logged in redirect to the login page...



if (!isset($_SESSION['loggedin'])) {
        header('Location: login.php'); //here you put your login page
        exit;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM