你好,我有一个问题。我已经设置了我的登录系统与cookie,它的工作原理。但是我想知道是否有更干净的版本。
<?
include('../config/db_config.php');
$username = $_COOKIE['user'];
$password = $_COOKIE['pass'];
$result = mysql_query("SELECT * FROM users WHERE isadmin = 1");
while($row = mysql_fetch_array($result))
{
if($username == $row['username'] && $password == $row['password'])
{
//User entered correct username and password
echo("ALLOW");
}
else
{
//User entered incorrect username and password
echo("DENY");
}
}
?>
如果我以管理员身份登录,您会看到我希望仅显示我的所有内容。那么,现在唯一的做法就是ECHO出我的HTML / PHP / Javascript而不是回显ALLOW,因为如果我只是包含(“somepage.php”),那么该页面仍然可以在不登录的情况下使用,即使我在那里做同样的检查,我仍然会回避所有事情。
答案 0 :(得分:4)
为什么要加载每个用户,然后比较用户名和密码?加载匹配用户名和密码的单个用户会不会更容易?
加载单个用户将允许删除while()
。
在PHP中,不使用mysql_query
; 做使用PDO(如果需要,请谷歌知道它为什么更好)。
检查您的输入(这里非常可选,我同意)。
绝不以纯文本格式存储密码。
你可以做类似的事情(我多年没有使用过PHP / PDO,所以代码可能不准确):
if (strlen($username)> 128)
{
// Something wrong. The username is too long.
}
$hash = sha1($password);
$sth = $dbh->prepare('if exists(select * from users where isadmin = 1 and username = :username and password = :password) select 1 else select 0');
$sth->bindParam(':username', $username, PDO::PARAM_STR, 128);
$sth->bindParam(':password', $hash, PDO::PARAM_STR, 40);
$sth->execute();
$isFound = $sth->fetchAll();
if ($isFound)
{
// User entered correct username and password.
echo 'ALLOW';
}
答案 1 :(得分:3)
您可以在登录页面(或任何检查登录的页面)上设置一个会话变量,该变量存储它们是否已登录并且它将在页面中保持不变。然后你可以简单地将你的admin html包装在if语句中,如下所示:
<?php
if ($_SESSION['isAdmin'] == true) {
?>
<p>My admin html</p>
<?php
} else {
?>
<p>My non-admin html</p>
<?php
}
?>
要在会话中保存信息,只需将其添加到您拥有echo("ALLOW");
的部分:
$ _SESSION ['isAdmin'] = true;
您还需要将session_start();
添加到脚本的顶部。
答案 2 :(得分:0)
我建议你只做一次这样的事情,当用户第一次访问页面,然后在剩下的时间里设置$ _SESSION ['is_admin']或其他东西,这样你就没有每个页面进行额外的数据库调用。
答案 3 :(得分:0)
您可以随时将“somepage.php”放在文档根目录下。这是阻止直接执行的常用方法。
例如,如果您的网络服务器看起来像'project / public_html / index.php',请将您的admin-only包含在'project / somepage.php'中,然后使用include(“../ somepage.php”)等引用它)。
显然,这需要根据您使用的实际路径进行调整。