Aim
一个简单的登录页面,只检查用户凭据,如果它在数据库中更正,则允许用户登录并检查其他页面,如果已经提供了sessoin,则允许用户在其他页面中执行任何操作,将其重定向到登录页面认证 .
连接已设置并正常工作:
Session 已经开始:
用于检查输入和echo变量的简单检查功能:
function Check_Param($val){
$value1=addslashes($val);
$string1=htmlspecialchars($value1);
$string2=strip_tags($string1);
return $string2;
}
现在,用户将通过表单进行身份验证并运行此功能以检查他是否可以登录页面并将$ _session ['username'] AND $ _session ['password'] AND $ _session ['level']传递给下一页存储到浏览器告诉获取destroy命令 .
public function auth($name = '', $password = '', $level=''){
$sql = "SELECT COUNT(*) FROM dab_users WHERE `name`=:name AND `password`=:password AND `level`=:level ";
$result = $this->conn->prepare($sql);
$passme = hash_value(Check_Param($this->password));
$result->execute(array(
":name" => Check_Param($_POST['name']),
":password" => Check_Param($_POST['passwrod'),
":level" => Check_Param($_POST['level'])
));
$num = $result->fetchColumn();
if($num==1){
$_SESSION['level'] = $_POST['level'];
$_SESSION['is_log'] = 1;
header("location:home/index.php");
}else {
$result->execute(array(
":name" => Check_Param(''),
":password" => Check_Param(''),
":level" => Check_Param('')));
echo "wrong password and user";
}
}
这工作正常,我可以在索引页面视图上提供正确的密码后访问页面,在此身份验证后,用户可以访问此处是我设法限制未知用户或空白会话或更正会话的方式这一页 .
index.php:
<?php
if(!empty($_SESSION['is_log'] && !$_SESSION['level'] == 101){
header("location:../login.php");
} else {
?>
<h1>header + content + footer</h1>
<?php } ?>
Question: 这里提交表格后,用正确的用户名和密码以及数据库中的级别登录到索引页面,在回显会话中我看到 level 和 is_log 在aut类上设置了 . 如果没有登录,索引页面上的 (if) 也可以工作并重定向用户...
-
这样安全吗?
-
这足以满足会话限制吗?
-
是这个精细的会话控制?
-
我是否正确控制会话?
-
任何好的建议或教程?
1 回答
您的身份验证系统有效,但如果您无法检查每个页面上的控制安全性,该怎么办?您应该了解front controller pattern,看看它是否更符合您的需求 .
与前端控制器模式相关,我建议你也阅读奇妙的symfony文档中的那两章(它们与symfony有些相关,但总体上讨论了HTTP / PHP以及框架最终如何以及为什么有益于你的代码):
HTTP Fundamentals
Better ways to architecture your code
如果您担心安全性(当然您应该这样做),请查看OWASAP top 10 web vulnerabilities(每个Web开发人员都必须阅读) .
具体到你的问题是会话劫持问题,你可以找到更多here .