2010-08-28 149 views
7

下面是其安全登錄是要實現的登錄系統/PHP安全登錄 - 密碼加密

main_login.php 

    <form name="form1" method="post" action="checklogin.php"> 
    Username:<input name="myusername" type="text" id="myusername" /> <br /> 
    Password:<input name="mypassword" type="password" id="mypassword" /> 
    <input type="submit" name="Submit" value="Login" /> 
    </form> 

Checklogin.php

<?php 
ob_start(); 
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="cosmos"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_register("myusername"); 
session_register("mypassword"); 
header("location:login_success.php"); 
} 
else { 
echo "Wrong Username or Password"; 
} 

ob_end_flush(); 
?> 

login_success.php

<?php 
session_start(); 

if(isset($_SESSION['username']) && ($_SESSION['username'] == $myusername)){ 
header("location:main_login.php"); 
} 
?> 

<html> 
<body> 
Login Successful. <a href="logout.php">Logout</a> 
</body> 
</html> 

logout.php

<?php 
session_destroy(); 

header("location:main_login.php"); 
?> 

問題是我想通過密碼加密或任何其他方法(如果有的話)進行此安全登錄。我是初學者到PHP

+1

你想要加密的是什麼,爲什麼? – 2010-08-28 09:29:16

+2

您應該在密碼輸入字段中使用「密碼」類型。 – Gumbo 2010-08-28 09:31:03

回答

5

您可以加密的密碼使用MD5學位。您將需要從當用戶註冊和登錄MD5之前....

例MD5密碼: // Define $myusername and $mypassword $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; $mypassword = md5($mypassword);

您還需要只要你有一個用戶註冊使用這個。

+0

這是可怕的不安全。你應該使用更強大的哈希算法(比如bcrypt)。你的代碼也容易受到sql注入的影響。 – CountMurphy 2017-11-02 16:02:01

2

爲了使這個更安全一點,你應該在數據庫中存儲加密的密碼,然後比較加密的輸入密碼和存儲的散列。這樣,如果有人以某種方式訪問​​成員表,他們不能看到實際的密碼。

假設密碼是myPassword那麼不要只是存儲它,首先使用像md5這樣的算法對其進行散列,然後在數據庫中存儲散列值爲deb1536f480475f7d593219aa1afd74c。然後當用戶輸入密碼時,對其進行散列並比較兩個散列。

要獲得更安全的方法,請使用SSL

+1

加密是可逆的;這不是一個好主意。更好地使用哈希。 – Gumbo 2010-08-28 09:33:46

1

通常情況下,您會在數據庫中存儲密碼的散列,請參閱md5但是,這並不能保證網頁和服務器之間的安全 - 爲此,您需要使用https。

這裏有兩件事。

1. 如果我是個笨手笨腳的用戶,當我註冊您的網站時,我必須輸入密碼我可能會給出與我在其他地方使用的密碼相同的密碼,所以您的網站應該真的存儲密碼的哈希值真實的東西,所以如果他們被黑客攻擊者不會得到我在任何地方使用的密碼。爲此,您將散列存儲在您的成員表中,並在查詢中檢查它是否有效,而不是傳遞散列值。

2. 在http下,密碼將以純文本形式從瀏覽器發送到服務器。如果這是通過互聯網並且攻擊者可以訪問瀏覽器和客戶端之間的任何網絡,那麼他們可以看到密碼 - 如果您使用JavaScript將其哈希在瀏覽器中,攻擊者可以拿起哈希並且可能使用它來登錄您的網站。這就是爲什麼我們有https。對於低成本(特別是與開發成本相比),您可以購買證書來保證連接的安全。如果你不想這樣做,你可以自己簽署證書並使用它。如果您的託管服務不允許您使用證書,那麼可能會創建一個家庭衝煮解決方案,但是找到其他託管服務會更好。

+0

好吧我在這個 真的很糟糕,但我想知道,如果例如由於某種原因,我沒有訪問SSL,那麼我如何使用散列方法?我的意思是我必須使用md5函數創建一個註冊頁面,所有的,你能解釋一下... – 2010-08-28 09:29:11

+0

@tune無論如何SSL沒有任何關係。它是受保護的密碼存儲,而不是每個人都在談論的登錄系統。 – 2010-08-28 09:34:39

+0

看到我的編輯 - 但正如其他人提到的,也許你應該嘗試一些開源的CMS之前,試圖實現自己的。 – 2010-08-28 19:07:01

2

將註冊數據插入表時,可以使用md5($ password)或sha1($ password)。

再次匹配登錄登錄

$ SQL = 「SELECT * FROM $ tbl_name其中username = '$名爲myUsername' 和密碼= '」「'MD5($輸入mypassword)。'; $ result = mysql_query($ sql);

還有一些其他的方式,以進一步保護。使用sha1和鹽的組合。

順便說一句,爲什麼不使用一些快速的PHP框架因爲這些小東西已經與他們一起構建。

謝謝

+3

@tunetosuraj:你是一個PHP初學者時正在構建一個CMS嗎?你如何建議使用你自定義的開源CMS來滿足他們的需求? – 2010-08-28 09:44:06

4

作爲一個初學者,很可能你不需要任何加密。特別是因爲它會是Javascript,而不是PHP。
雖然可以做到。
你可以使用實現摘要式身份驗證模式散列挑戰

  • 服務器發送一個挑戰 - 一個隨機strimg
  • 客戶端使這一挑戰的哈希和密碼
  • 這個散列發送到服務器
  • 服務器以相同的方式做一個哈希值並比較兩者

有很多Javascript MD5哈希算法實現在內部淨。

當然,SSL證書比這個自制的實現更受歡迎。

但是,要得到正確的答案,您仍然需要闡明您想要加密的原因以及原因。你爲什麼不關心保護別的東西。例如您的整個數據庫。

一段時間的筆記。
您的login_success代碼可能無法正常工作並且無法保護。
這應該只是

if(isset($_SESSION['username'])){ 

因爲沒有$名爲myusername變量比較。
還有應該是exit;之後header("location:...
或客戶將得到保護的內容,反正

+2

自制的執行可以通過中間人攻擊來擊敗。儘管如此,它仍然可以防止竊聽。 – 2010-08-28 09:46:03

+0

@Georg怎麼來的?我看不到 – 2010-08-28 09:53:53

+0

中間人可以修改發送給客戶端的Javascript(例如,刪除加密代碼)或者構成服務器。真正的SSL安全連接與證書一起工作,以確保您與之通話的服務器確實是您想要與之通話的服務器。 – 2010-08-28 11:06:23

2

您應該使用

$static_salt='asdfasdfqwertyuiop123ABC_some_static_salt_string'; 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 
$mypassword=hash('sha512', $mypassword . $static_salt . $myusername); 

您必須存儲哈希密碼哈希和任何密碼,你把它們比作存儲的一個前。 MD5是不適合散列密碼,請參閱: http://uk1.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash 你也應該考慮使用salts

+0

散列算法SHA *既不適合哈希密碼,尤其是不像您的示例那樣未哈希。它們速度太快,而是使用像BCrypt或PBKDF2這樣的慢速密鑰派生函數。 – martinstoeckli 2014-03-22 21:21:20

+0

我同意如果你看看我的答案中包含的兩個鏈接,PHP文檔討論了合適的哈希算法,但我認爲sha512比sha1更好,所以我會改變我的答案,並且還提供了一個鏈接鹽的信息,我也會在我的答案中加入。 – nettux443 2014-03-28 14:13:16

+1

我知道你只想提高接受的答案,但這是一個很老的線索,最好在對答案的評論中指出這一點。您的示例仍然是一種非常不安全的密碼散列方式,靜態鹽不能算作鹽,而SHA512仍然不合適。我想邀請你閱讀我的關於[安全密碼存儲]的教程(http://www.martinstoeckli.ch/hash/en/index.php)。 – martinstoeckli 2014-03-28 16:39:55

0

MD5是在這種情況下最好的。通過MD5函數運行密碼等輸入詳細信息並插入數據庫。

它幾乎不可修改,所以使用它的唯一方法是在登錄時也使用MD5,並將登錄時的md5密碼與存儲在數據庫中的版本進行比較。