【问题标题】:How to prevent a user from directly accessing my html page by writing URL?如何防止用户通过编写 URL 直接访问我的 html 页面?
【发布时间】:2015-05-25 07:31:19
【问题描述】:

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

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

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

问题案例 => www.example.com/page2.html => page2.html , NO LogIN :(

【问题讨论】:

  • page3.html => 没有登录。再试一次。或留在 login.html
  • 在php中使用session来检查用户是否登录,如果没有登录则重定向回登录页面
  • 不能用php SESSION吗?
  • 你可以使用 session.... =)

标签: php authorization


【解决方案1】:

您可以通过这样的 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');  

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

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

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

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

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

【讨论】:

  • 我知道我将不得不为此涉及 PHP,但问题是我一直是 Asp.Net 人,并且对 php 一无所知。那么你能解释一下这个过程并用代码替换 cmets 吗?我也很困惑我的页面是 .php 格式还是 .html 格式?在某些链接中,有一个单独的 php 文件处理所有登录过程,但没有人提到 Baby Steps。
  • 我编辑了我的答案来解释代码,如果你对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 更好,并且更有经验。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      注意:如何设置文件禁止外部访问不在我的回答范围内

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,发现了这个问题,而且效果很好:(在 javascript 中) 只需将其放在文档顶部即可。

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

        【讨论】:

          【解决方案6】:

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

          希望它会有所帮助。

          【讨论】:

            【解决方案7】:

            如果您使用的是 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,因为如果它被访问,它通常会被标记为删除。您还想检查它是否为 null,因为如果用户没有首先通过登录页面,它可能从未被分配。

            【讨论】:

              【解决方案8】:

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

              // 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;
                  }
              

              【讨论】:

                猜你喜欢
                • 2021-03-07
                • 1970-01-01
                • 2016-11-22
                • 1970-01-01
                • 1970-01-01
                • 2018-06-25
                • 1970-01-01
                • 2017-11-22
                • 2019-11-03
                相关资源
                最近更新 更多