阻止直接访问php页面,仅在重定向时访问

时间:2010-04-06 20:08:19

标签: php

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

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

我想只有从main.php

重定向才能访问noaccess.php

有什么建议吗?

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

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

10 个答案:

答案 0 :(得分:7)

如果您每次要重定向,都会在$ _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";
}

我真的不知道这是否会起作用,但这就是我会想到的。

答案 1 :(得分:4)

试试这个

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

   echo "uh?"; }

else {

   // The script
 }  

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

以下是防止直接访问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
}

答案 4 :(得分:1)

我知道这已经得到回答。尽管答案是好的,但我正面临着同样的情况,所以我想我会投入两点。

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

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

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

或者,如果您不想遇到麻烦,我将创建一个变量,该变量可以在noccess.php中全局访问,并带有简单的true false。

这就是我要做的:

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,因为这意味着当您想要做的只是安全访问时,不必要地张贴表单

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

其他人是正确的有$ _SERVER [“HTTP_REFERER”]的问题所以我想最好的方法是将变量设置为$ _SESSION或$ _POST,你需要检查该变量是否存在,如果不是,则意味着它是直接访问。

答案 8 :(得分:0)

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

$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();
}

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

答案 9 :(得分:0)

我想我回答这个问题晚了,但我的方式是

<?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 和密码或其他东西就这样。