我正在构建一个小型cms系统。用户可以登录并编辑、删除或创建新数据库中的项目。
我的问题是。这个登录系统是否足够安全?
<?php
session_start(); ?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>.....</title>
</head>
<body>
<?php
include 'koder.inc.php';
if(!isset($_POST['forsoeg'])){
$forsoeg = 0;
$check_user='0';
$check_pass='0';
} else {
$forsoeg = $_POST['forsoeg'];
$check_user = $_POST['username'];
$check_pass = $_POST['password']; }
if($check_user != $username || $check_pass != $password) {
if($forsoeg >3){
exit("<p>Wrong password or username <br /><br />
<a href='admin_logon.php'>back to login</a></p>");}
$forsoeg ++;
?>
<h1>Login</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="form">
<p>
<label for="username">username:</label>
<br />
<input title="username:" type="text" name="username" />
</p>
<p>
<label for="password">Password:</label>
<br />
<input title="Skriv dit password" type="text" name="password" />
</p>
<p>
<input class="knap" type="submit" name="Send" value="Login" />
</p>
<input type="hidden" name="forsoeg" value="<?php echo $forsoeg; ?>" />
</form>
<?php
} else {
$_SESSION['logon']="ok";
echo "Login ok..<br />
<a href='administration.php'>Go to admin page</a>"; } ?>
</body>
</html>
然后我包括fil koder.inc.php
<?php
$username = "test";
$password = "123456";
?>
在需要有效用户的页面上,我开始页面
<?php
session_start(); ?>
如果用户凭据存储在纯文本文件中,则非常不安全。这种方法在当今的系统中非常罕见。我建议您为用户使用数据库并以散列格式存储他们的密码,例如 md5。当您有多个用户时,这也更好!
除了已经说明的要点之外,您还存在 HTML 注入漏洞(导致跨站点脚本攻击):
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"
在这里:
<input type="hidden" name="forsoeg" value="<?php echo $forsoeg; ?>" />
每次将文本内容输出到 HTML 标记时都必须使用 htmlspecialchars()
。例如:
function h($s) {
echo htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}
...
<form action="<?php h($_SERVER['PHP_SELF']); ?>" ...
<input type="hidden" name="forsoeg" value="<?php h($forsoeg); ?>" />
如果要
进行多用户设置,则应从纯文本文件迁移,并改用数据库。
为了在数据库中存储密码,您需要首先使用PBKDF2等对其进行加密,然后添加盐,然后再次加密。盐必须是随机的,将其与密码一起保存在以明文形式存储的数据库中是安全的。
要验证登录,您需要从数据库中提取密码,并将其与存储在 $_POST
变量中的密码的加密版本进行匹配。