PHP登录系统。安全吗?

PHP登录系统。安全吗?,php,security,login,Php,Security,Login,我正在建立一个小型cms系统。用户可以登录并在数据库中编辑、删除或创建新项目 我的问题是。这个登录系统足够安全吗 <?php session_start(); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>.....</title> </head> <body> <?php include

我正在建立一个小型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。
当您有多个用户时,这也会更好

如果要进行多用户设置,则应从纯文本文件迁移,并改用数据库

要在数据库中存储密码,您需要首先使用等对其进行加密,然后添加一个salt,然后再次加密。密码必须是随机的,将其与密码一起以明文形式存储在数据库中是安全的


要验证登录,您需要从数据库中提取密码,并将其与存储在
$\u POST
变量中的密码的加密版本相匹配。

除了已经声明的要点外,您还存在HTML注入漏洞(导致跨站点脚本攻击):


用户名密码以明文形式存储在文件中-您只有一个用户?@Dagon您不能对明文文件使用SQL注入:Pteehee@user名称以纯文本形式存储在文件中的密码。。这是一个问题吗?现在是的。但是,随着时间的推移,我将不得不创建更多的用户。使用db(文本文件不可缩放),不要存储纯文本密码-这个主题已经讨论了数百万次,将尝试次数放入隐藏字段?好的,我每次都会将其重置为
0
。好的,我必须找到som教程。这是我前进的道路。Thx的答案。此外,您应该将登录尝试存储在会话变量中。隐藏的post字段可以被操纵。请参阅我对tuxtimo的回复,但这会产生误导,并且可能与将密码存储为纯文本一样危险。考虑到当今的技术,Salting的作用很小,建议结合使用sha512将导致一种错误的安全感。这种说法是正确的,SHA不足以用于密码存储,请使用BCrypt、SCrypt或PKBDF2。一个快速来源:更新了我的答案,以提供PBKDF2链接而不是SHA。为什么不建议使用它呢?实际上,md5()/sha1()/sha256()/sha512()都是不适合存储密码的哈希值-它们需要很少的时间来测试。”bcrypt'或“pbkdf2”更好,因为它们将随着技术进步而扩展。
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"
<input type="hidden" name="forsoeg" value="<?php echo $forsoeg; ?>"  />
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); ?>"  />