基本上,我在两个不同的目录中有两个文件: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}而不是登录。如何在那里添加另一个条件来阻止它?
答案 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变量(在URL中)或作为cookie传递。两者都很容易窃取不安全的网络或XSS漏洞。
您应该在会话检查中添加SSL加密登录页面,以确保用户在进入您网站的关键区域之前已登录。