【问题标题】:preventing direct access to a php page, only access if redirected防止直接访问 php 页面,仅在重定向时访问
【发布时间】:2011-02-04 23:38:33
【问题描述】:

我想让我的 php 页面只能从另一个页面重定向访问,并阻止我的用户直接访问它。

我的意思是,假设我有一个名为 "main.php" 的页面和另一个我想要阻止直接访问的 PHP 文件,名为 "noaccess.php"。

我想让 noaccess.php 只有在我从 main.php 重定向时才可访问

有什么建议吗?

更新:会话是个好主意,但问题是我必须使用 JavaScript 来重定向页面,所以问题是,我可以使用 ajax 来设置 PHP 会话吗?

更新 2:好的,我找到了解决方案,我现在不需要阻止直接访问,因为我可以从 mysql 检查页面是否需要访问。

【问题讨论】:

  • 您的问题变得越来越复杂和不寻常。你能在这里显示整个图片,而不是一个小片段吗?
  • 好吧,访问限制是发明会话的目的。但是您需要检查的不是“重定向的事实”,而只是项目锁定状态。

标签: php


【解决方案1】:

如果每次您要重定向时都在 $_SESSION 变量中保存了一个值。所以你有

//code
$_SESSION['fromMain'] = "true";
header("Location: noaccess.php");

然后在 noaccess.php 中放

if($_SESSION['fromMain'] == "false"){
   //send them back
   header("Location: foo.php");
}
else{
   //reset the variable
   $_SESSION['fromMain'] = "false";
}

我真的不知道这是否可行,但这是我会尝试的。

【讨论】:

  • 哦,我忘了提,我必须使用 javascript 来重定向页面,所以我将如何启动会话:(?我可以使用 ajax 启动会话吗?
  • 不确定。我总是有一个包含 session_start() 的配置文件,然后我在每个页面中都包含_once("config.php"),这样我就不必费心了。我想你可以用 session_start() 对一个 php 文件进行 ajax 调用,看看它是否有效。
【解决方案2】:

试试这个

if (!isset($_SERVER['HTTP_REFERER'])){

   echo "uh?"; }

else {

   // The script
 }  

【讨论】:

【解决方案3】:

我认为您可能从错误的方向来解决问题,但如果您真的想实现这一点,我很可能会使用session variable 来实现。只需让main.php 设置一个标志,表明他们现在可以访问noaccess.php,然后重定向到那里。 noaccess.php 检查标志,只有在它被设置时才起作用。

【讨论】:

    【解决方案4】:

    你试过这个伊娃。以下是有效的代码:

    $url != 'your-url-which-you-do-not-what-direct access';
    
    if ($_SERVER['HTTP_REFERER'] == $url) {
      header('Location: otherurl.php'); //redirect to some other page
      exit();
    }
    

    确保它显示在您不想直接访问的页面顶部。

    【讨论】:

      【解决方案5】:

      为防止访问页面,最佳做法是使用会话变量 $_SESSION['username']$_SESSION['password'] 来检查您的数据库表记录,假设您的表名为 "users",字段'username''password' 以便用户访问该页面,否则他们将被重定向到登录页面,以便他们提供正确的用户名和密码通过输入字段。

      以下是防止直接访问 PHP 页面的剖析。

      session_start();
      
      $username=$_POST['username'];
      $password=$_POST['password'];
      
      $query="select * from users where username='$_SESSION[username]' and     password='$_SESSION[password]'";
      
      $result=mysql_query($query);
      
      if($result)
      {
      
      echo "Your login was successful..";// the page you want to go to if login successful
      {
      else
      {
      
      header("Location:index.php?action=login");//any page you want to return to if log in failed
      }
      

      【讨论】:

      • 请在写答案时尽量使用正确的英语。
      • Guvante 谢谢你,我会这样做的,只是我有时会使用快捷方式。
      【解决方案6】:

      我知道这已经得到了回答。虽然答案很好,但我只是面临同样的情况,所以我想我会把我的两个放在里面。

      我不会使用 HTTP_REFERER 它不可靠,甚至不是每个浏览器都显示它。

      我不会使用会话变量,因为它是有状态的,您必须编写更多代码行来检查每个请求,从而导致不必要的膨胀。

      理想情况下,我会创建一个具有两个主要功能且无访问权限的控制器类

      或者,如果你不想经历那个麻烦,我会创建一个变量,它可以在 noccess.php 中全局访问,并带有一个简单的真假。

      这就是我会做的:

      class Access{
      
          protected $access = false;
      
          public function main(){
              //Authenticate and set
              include_once 'main.php';
              $this->access = true;
          }
      
          public function no access(){
              if($this->access === true){
                  include_once 'no access'.php;
              }else{
                  header('location: main.php');
              }
          }
      }
      

      或者如果你不想经历那个麻烦你可以创建一个简单的函数或设置一个可以从 noaccess.php 访问的简单变量:

      //main.php
      $access = false;
      
      header('location: noaccess.php');
      
      //noaccess.php
      include 'main.php';
      if($access){
          //Continue
      }else{
          header('location: main.php');
      }
      

      我相信您可以简化这一点,但这将是最简单和最安全的方法,而不是依赖于服务器变量。 我不会使用 $_SESSION 或 $_POST 因为这意味着当您只想安全访问时不必要地发布表单

      【讨论】:

        【解决方案7】:

        您可以使用 $_SERVER["HTTP_REFERER"]。将以下代码放在 php 文件的开头,并将 $url 设置为与所需的 url 相同,例如 http://a.com/main.php

        if ($_SERVER['HTTP_REFERER'] != $url) {
            header('Location: noaccess.php');
            exit();
        }
        

        【讨论】:

        • 哪个是用户可以定义的,所以根本不可信。
        • 另一方面,许多偏执的防火墙切断了这个标头
        • 我想是的,它似乎根本不可信
        【解决方案8】:

        为什么不只是include 而不是重定向?

        【讨论】:

        • include 不适合的情况:(
        【解决方案9】:

        其他人是对的,$_SERVER["HTTP_REFERER"] 存在问题,所以我想最好的方法是将变量设置为 $_SESSION 或 $_POST 并且您需要检查该变量是否存在,如果不是,则表示它是直接访问。

        【讨论】:

          【解决方案10】:

          我想我迟到了,但我的方式是

          <?php
          $page = basename($_SERVER['PHP_SELF']);//gets current URL
          if ($page == "nonaccesspage.php") //any page u don't want to be accessed directly
          header('Location:index.php');
          else if($page == "nonaccesspage2.php") //page 2 which is not accessible 
          header('Location:index.php');
          ?>
          

          如果你想授权用户访问页面(我的意思是有一个页面不包含但可以通过 URL 访问)只需使用 $_POST 或 $SESSION 来授权用户 ID 和密码或其他东西像这样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-05
            • 2010-09-16
            • 1970-01-01
            • 2012-05-22
            • 2012-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多