如何在PHP中结束会话以防止对某些目录的不允许访问


How to end session in PHP to prevent unallowed access to some directories?

我为我的主页做了一个搜索简介。当普通用户登录并更改web地址中的目录时,他们可以访问应该仅限于用户帐户的所有信息。例如,普通用户可以访问以下站点:

http://deped.gov.ph/login/Schools/BacoorES/SearchOutput.php?id=393

但是当他将"BacoorES"更改为"Admin"时,它将重定向为Admin用户。当用户更改目录时,我需要帮助如何结束会话。

<?php
    session_start();
    if($_SESSION['name']){
    }else 
    $home_url='http://www.deped.gov.ph/login';
   header('Location: ' . $home_url);
   ?>
<?php include '../../template-header/header.php' ?>            

我不认为结束会话是解决这个问题的方法。一种方法是使用用户访问级别的会话变量。例如,一开始它是0,当你登录时它会变成1,如果你是管理员它会变成2

然后在每个页面的开头,您可以检查用户是否有足够的凭据来查看它们。例如,对于管理页面:

session_start();
if($_SESSION['user_level'] < 2) {
    //Redirect to an access denied page.
    header('Location: access_denied.php');
}
else {
    //Here you can put the code for the admin only page.
}
当然,有很多很多方法来解决这个问题。在实践中,这可能不是最好的方法,但它说明了基本方法。依靠"通过模糊实现安全",即假设人们不会发现url,是不安全的,即使你不做搜索配置文件。

你可以这样做…

$dirpath = '/login/Schools/';
$closing = '/';
if(strpos($dirpath . $_SESSION['name'] . $closing, $_SERVER['REQUEST_URI']) !== FALSE) {
    //user is in correct path
} else {
    //user is guessing throw them out...
}

将检查当前请求的用户名路径。你想采取的行动取决于你自己。

注意,我没有测试上面的代码,因为它目前是写的,因为我没有目录结构。我测试了。

$dirpath = '/testingabc123/';
$closing = ''; //'/';
if(strpos($dirpath . '1246.php' . $closing, $_SERVER['REQUEST_URI']) !== ) {
    echo 'in';
} else {
    echo 'out';
}

我的页面是/testingabc123/1246.php$closing很重要,因为没有它,用户名jon可以匹配jonathon。另外,我假定您不允许在用户名中使用/。如果你这样做,用户可以将他们的用户名设置为/login/Schools/admin/,这将授予他们访问。