Как завершить сеанс PHP на странице закрытия - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть несколько страниц в каталоге AJAX. Я не хочу, чтобы эти страницы были доступны напрямую, поэтому вы не можете просто ввести URL-адрес страницы в каталоге AJAX и получить к ней доступ. Я «решил» это, используя сеанс 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 сохраняется, и теперь он может получить доступ к странице напрямую. Как убить сеанс после того, как они покинут родительскую страницу?

ТНХ

Ответы [ 6 ]

2 голосов
/ 08 ноября 2010

зачем использовать сессию?

, если я понял, что вы хотите:

<?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 голос
/ 08 ноября 2010

Действительно простое решение - открыть все файлы, которые вы хотите защитить, от прямого ввода URL-адреса и добавить в начало следующее:

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

Теперь избавьтесь от скрипта перенаправления, поскольку он бесполезенсейчас.Вам не нужно использовать сессии для этого.Каждый раз, когда вы запрашиваете страницу, используйте ее прямой URL, просто добавьте ?ajax=1 в ее конец.

Добавив ?ajax=1, PHP установит ключ 'ajax' для $_GET глобальная переменная со значением 1.Если ?ajax=1 опущен в URL, тогда PHP не установит ключ 'ajax' в $_GET, и поэтому, когда вы проверите, установлен ли он на isset(), он вернет false, таким образом, скрипт умрет и невыводить что угодно.По сути, страница будет выводить данные только в том случае, если в конце URL-адреса указан ?ajax=1.

Кто-то может все еще «подделать» URL-адрес и самостоятельно добавить «?ajax=1», но это не является поведением по умолчанию длялюди или веб-браузеры.Если вам абсолютно необходимо предотвратить это, то это будет намного сложнее, например, использование шаблонов вне общедоступной папки.Большинство других «простых» решений будут иметь такой же «подделывающий» потенциал.

1 голос
/ 08 ноября 2010

Нет никакого способа сделать это со 100% -ной уверенностью - проблема в том, что и AJAX, и обычные вызовы веб-браузера на ваш веб-сайт используют один и тот же базовый протокол: 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 будет включать в себя нужный файл.

0 голосов
/ 08 ноября 2010

Почему бы и нет (на странице 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"]);
0 голосов
/ 08 ноября 2010

Я никогда не пробовал этого, но, возможно, вы могли бы что-то сделать с jQuery .unload () , а затем вызвать страницу PHP для unset() сессии.

0 голосов
/ 08 ноября 2010

Я не думаю, что есть надежный способ сделать то, что вы просите, так как заголовки HTTP-запроса могут быть поддельными. Однако вы можете использовать $_SERVER['HTTP_REFERER'], чтобы узнать, поступает ли запрос с другой страницы вашего сайта.

Если уровень безопасности на вашем сайте хороший, сбой этого метода не предоставит пользователю доступ ко всему, к чему у него уже нет доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...