Запретить прямой доступ - PullRequest
1 голос
/ 22 ноября 2011

По сути, у меня есть два файла в двух разных каталогах: index.php (в / login /) и index.php (в / login / покупатель /).

/ login /Файл customer / index.php содержит:

<?php
session_start();

function isLoggedIn()
{
    if(isset($_SESSION['valid']) && $_SESSION['valid'])
        return true;
    return false;
}

//if the user has not logged in
if(!isLoggedIn())
{
    header('Location: index.php');
    die();
}
?>

<?php 
    if($_SESSION['valid'] == 1){
        echo "<a href='../logout.php'>Logout</a>";
    }
    else{
        echo "<a href='../index.php'>Login</a>";
    }
?>

Файл / login / index.php содержит:

<!--

an form to login

-->

<?php 
    if($_SESSION['valid'] == 1){ #user has logged in by creating a session var
        echo "<a href='logout.php'>Logout</a>";
    }
    else{
        return true;
    }
?>

Эти два файла, кажется,работать нормально, но, например, злоумышленник хочет попытаться получить прямой доступ к /login/buyer/ без предоставления учетных данных и хочет просто попробовать это в конце URL-адреса, например mysite.com/login/buyer, вместо входа в систему. Как я могу добавитьдругое условие, чтобы остановить это?

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Я предлагаю использовать один /index.php файл (то есть, " controller ") для всех веб-доступов.

Таким образом, вы должны проверить один раз для всех файловесли сеанс действителен или нет.

Используйте параметры, чтобы указать, какие " module " и " action " (словарь Symfony 1.x) вы хотите продолжить.

Например, yoursite.com/index.php?module=user&action=login&type=buyer или лучше с .htaccess и механизмом маршрутизации: yousite.com/user/login/buyer

Как я предлагаю в этом другом вопросе , даже лучше поместить index.php и другие исходные файлы (к которым нельзя обращаться напрямую через веб-сервер), в отдельные каталоги.

Дополнительные рекомендации :

function isLoggedIn()
{
    if(isset($_SESSION['valid']) && $_SESSION['valid'])
        return true;
    return false;
}

можно просто переписать в:

function isLoggedIn()
{
    return (isset($_SESSION['valid']) && $_SESSION['valid']);
}
0 голосов
/ 22 ноября 2011

Считается, что максимальная безопасность заставляет пользователя снова входить в систему, прежде чем он перейдет на страницу фактического платежа или индекс покупателя.

Это потому, что истинная информация об авторизации небезопасна в переменных сеанса, так как идентификатор сеанса, который PHP использует для идентификации каждого пользователя, передается либо переменными GET (в URL), либо в виде файла cookie. Оба очень легко украсть через незащищенную сеть или уязвимости XSS.

У вас должна быть страница входа в зашифрованном виде SSL В дополнение к проверке сеанса, чтобы убедиться, что пользователь вошел в систему до входа в критическую область на вашем веб-сайте.

0 голосов
/ 22 ноября 2011

Вы всегда должны проверять действительный сеанс на каждой странице.

Похоже, ваш код делает это (хотя мой PHP ржавый).

Если кто-то, кто не является покупателем, входит в систему, а затем использует страницу покупателя, вам необходимо связать разрешения / роли с каждым типом учетной записи и при необходимости проверить соответствующие разрешения.

Например, на странице покупателя может быть что-то вроде

function isLoggedIn()
{
    if(isset($_SESSION['valid']) && $_SESSION['valid'] && isset('isBuyer') && $_SESSION['isBuyer'])
        return true;
    return false;
}

Вам потребуется заполнить $ _SESSION ['isBuyer'] во время входа в систему на основе предоставленного идентификатора пользователя.

...