2012-08-09 339 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); ?>" />