2012-08-09 310 views
-1

我正在建造一个小型cms系统。用户可以在数据库中登录和编辑,删除或创建新项目。PHP登录系统。安全?

我的问题是。这个登录系统足够安全吗?

<?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> 

我那么包括koder.inc.php

<?php 

$username = "test"; 
$password = "123456"; 


?> 

并就需要有效的用户的页面我

<?php 
session_start(); ?> 
+1

用户名密码以纯文本形式存储在文件中 - 您只有一个用户? – 2012-08-09 10:23:11

+0

@Dagon不能使用SQL注入用纯文本文件:存储在文件中明文P teehee – Fluffeh 2012-08-09 10:25:24

+0

@user名密码。这是个问题吗? 现在是。但是,我将不得不创造更多的用户。 – Kasper 2012-08-09 10:26:26

回答

-1

如果你打算为多用户设置,你应该从一个纯文本文件迁移,并使用数据库来代替。

对于数据库中存储的密码,您将需要先对其进行加密,使用PBKDF2等再加入盐,再对其进行加密。 salt必须是随机的,将它保存在数据库中以明文形式保存并连同密码是安全的。

要验证日志,你会从数据库中提取密码,并存储在$_POST可变密码的加密版本匹配。

+0

Okey,生病将不得不找到索姆教程。这是为我推进的方式。 Thx为答案。 – Kasper 2012-08-09 10:40:45

+1

另外,您应该将登录尝试存储在会话变量中。隐藏的邮政领域可以被操纵。 – Kao 2012-08-09 10:42:54

+1

查看我对tuxtimo的回复,但这是误导性的,可能与将密码存储为纯文本一样危险。腌制技术对于今天的技术几乎没有什么作用,并且推荐使用sha512的组合会导致错误的安全感。 – CubicleSoft 2012-08-09 14:01:13

1

如果用户凭据启动页面费尔以纯文本文件存储,这是非常不安全的。对于今天的系统来说,这种方法是非常罕见的。我建议你为用户使用数据库,并以散列格式存储他们的密码,如md5。 当你有不止一个用户时,这也会更好!

+2

md5不推荐 – 2012-08-09 10:37:19

+0

为什么不推荐它? – tuxtimo 2012-08-09 10:44:25

+3

事实上,MD5()/ SHA1()/ SHA256()/ SHA512()都用于存储密码的哈希值不恰当 - 他们需要琐碎时间来检验。 'bcrypt'或'pbkdf2'要好得多,因为它们会随着技术的进步而扩展。 – CubicleSoft 2012-08-09 13:58:58

1

除已规定的分数,你必须HTML注入漏洞(导致跨站脚本攻击)位置:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" 

这里:

<input type="hidden" name="forsoeg" value="<?php echo $forsoeg; ?>" /> 

必须使用htmlspecialchars()每次将文本内容输出到HTML标记中。例如:

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); ?>" />