禁止直接访问

时间:2011-11-21 20:02:58

标签: php security brute-force

基本上,我在两个不同的目录中有两个文件:index.php(在/ login /中)和index.php(在/ login / buyer /中)。

/ login / buyer / 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/而不提供凭据,并且只想在网址末尾尝试{{1}而不是登录。如何在那里添加另一个条件来阻止它?

3 个答案:

答案 0 :(得分:1)

我建议对所有网络访问使用单个/index.php文件(即“控制器”)。

这样,如果会话有效,您必须检查一次所有文件。

使用参数来判断您要继续使用哪个“模块”和“操作”(Symfony 1.x词汇表)。

E.g。 yoursite.com/index.php?module=user&action=login&type=buyer,或更好的 .htaccess 和路由引擎:yousite.com/user/login/buyer

正如我建议in this other question,最好将index.php和其他源文件(不应直接通过网络服务器访问)放在不同的目录中。

其他建议

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

可以简单地重写为:

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

答案 1 :(得分:0)

您应始终在每个页面上检查有效会话。

看起来你的代码就是这样(尽管我的PHP生锈了)。

如果某人不是买家登录然后使用买家页面,则需要将权限/角色与每种类型的帐户相关联,并在需要时检查适当的权限。

例如,在买家页面上,您可能会有类似

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

根据提供的用户ID,您必须在登录时填充$ _SESSION ['isBuyer']。

答案 2 :(得分:0)

在达到实际付款页面或买方索引之前,强制用户重新登录是最终的安全措施。

这是因为真正的授权信息在会话变量中是不安全的,因为PHP用来标识每个用户的会话ID由GET变量(在U​​RL中)或作为cookie传递。两者都很容易窃取不安全的网络或XSS漏洞。

您应该在会话检查中添加SSL加密登录页面,以确保用户在进入您网站的关键区域之前已登录。