如何在页面关闭时结束PHP会话

时间:2010-11-08 18:10:19

标签: php session

我在AJAX目录中有几个页面。我不希望直接访问这些页面,因此您不能只在AJAX目录中键入页面的URL并访问它。我通过在调用它的页面上使用PHP会话来“解决”这个问题,如下所示: 主页:

<?php
session_start();
$_SESSION['download']='ok';
?>

在ajax页面上我有这个:

<?php
session_start();
if($_SESSION['download']!=='ok'){
$redirect='/index.php'; //URL of the page where you want to redirect.
header("Location: $redirect");
exit;}
?>

唯一的问题是,如果用户经历了一次正确的过程,则会存储cookie,现在他们可以直接访问该页面。离开父页面后如何终止会话?

THX

6 个答案:

答案 0 :(得分:2)

为什么要使用会话?

如果我理解你想要的东西:

<?php /// Is ajax request var ?

    if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
    if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])=="xmlhttprequest") {

           // do your ajax code


    }    else {
           // redirect user to index.php since we do not allow direct script access, unless its ajax called
            $redirect='/index.php'; //URL of the page where you want to redirect.
            header("Location: $redirect");

        exit();
    }
    } ?>

答案 1 :(得分:1)

实际上没有办法以100%的确定性来实现这一点 - 问题是,对您的网站的AJAX和常规Web浏览器调用都使用相同的底层协议:HTTP。如果站点的完整性和安全性取决于阻止HTTP客户端请求特定URL,那么您的设计是错误的。

  

那么如何阻止人们直接访问某些目录中的文件,同时让网站使用它们呢?

创建一个控制器文件。将所有AJAX请求发送到此控制器。

Ajax的control.php

<?php
 $is_ajax = true;
 include "ajaxincludes/test.php";
 // ... use the ajax classes/functions ...

ajaxincludes / test.php的

<?php
 if (!isset($is_ajax) || !$is_ajax)) {
  exit("Hey you're not AJAX!");
 }
 // ... continue with internal ajax logic ...

如果客户端尝试直接在http://mysite/ajaxincludes/test.php访问该文件,则会收到错误消息。访问http://mysite/ajax-control.php将包含所需的文件。

答案 2 :(得分:1)

一个非常简单的解决方案是打开您要保护的每个文件,使其免受直接URL输入和将以下内容添加到顶部:

<?php if (isset($_GET['ajax']) != true) die();?>

现在摆脱你的重定向脚本,因为它现在没用了。您不需要为此使用会话。每次请求页面时,请使用它的直接网址,只需在其末尾添加?ajax=1即可。

通过添加?ajax=1,PHP会将{ajax'的键设置为$_GET全局变量,其值为1。如果从URL中省略?ajax=1,则PHP不会在ajax中设置“$_GET”的键,因此当您检查它是否设置为isset()时,它将返回false因此脚本将死亡而不输出任何内容。基本上,如果?ajax=1位于URL的末尾,页面将仅输出数据。

有人仍然可以“欺骗”网址并自行添加“?ajax=1”,但这不是人或网络浏览器的默认行为。如果你绝对需要防止这种情况,那么它会更加复杂,例如:使用公开文件夹之外的模板。大多数其他“简单”的解决方案都具有相同的“欺骗”潜力。

答案 3 :(得分:0)

由于HTTP请求标头可以伪造,因此我认为没有一种确定的方法可以满足您的要求。但是,您可以使用$_SERVER['HTTP_REFERER']查看该请求是否来自您网站上的其他网页。

如果您网站上的其他安全性良好,则此方法的失败不会授予用户访问他们无法访问的任何内容的权限。

答案 4 :(得分:0)

我从来没有尝试过这个,但也许你可以用jQuery的.unload()做一些事情,然后调用PHP页面到unset()会话。

答案 5 :(得分:0)

为什么不(在Ajax页面上):

session_start();
if($_SESSION['download']!=='ok'){
    $redirect='/index.php'; //URL of the page where you want to redirect.
    header("Location: $redirect");
    exit;
}

// do whatever you want with "access granted" user


// remove the download flag for this session
unset($_SESSION["download"]);