PHP登录系统。安全?

时间:2012-08-09 10:18:47

标签: php security login

我正在构建一个小型的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(); ?>

3 个答案:

答案 0 :(得分:1)

如果用户凭据存储在纯文本文件中,则非常不安全。对于今天的系统来说,这种方法非常罕见。我建议您为用户使用数据库,并以散列格式存储密码,如md5。 如果您不仅仅有一个用户,这也会更好!

答案 1 :(得分:1)

除了已经陈述的要点之外,您还有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); ?>"  />

答案 2 :(得分:-1)

如果您要进行多用户设置,则应从纯文本文件迁移,然后使用数据库。

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

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