2015-01-15 111 views
1

在我的管理頁面我有我可以編輯用戶頁面的表單。當我加載編輯頁面和表單時,我也從數據庫中加載信息,因爲如果這些字段是空的,那麼在提交表單後,它們在數據庫中也將變爲空。更新數據庫中的字段

問題在於密碼字段。當表單加載時,密碼字段爲password,並且顯示爲••••••••••••••••••••••••••••••••••••••••,它是DB 4d9012b4a77a9524d675dad27c3276ab5705e5e8的編碼密碼。如果我不改變密碼,也做了場在數據庫更新不輸入相同的密碼,併成爲該8122c907fcf084364519b613b3ba6a3a88c9f980 ..這是編輯文件

// keep track post values 
$username= $_POST['username']; 
$password = sha1($_POST['password']); 
$email = $_POST['email']; 

$fileName = $_FILES['user_image']['name']; 
$tmpName = $_FILES['user_image']['tmp_name']; 
$fileSize = $_FILES['user_image']['size']; 
$fileType = $_FILES['user_image']['type']; 

// make a new image name 
$ext = substr(strrchr($fileName, "."), 1); 
      // generate the random file name 
$randName = date('Y-m-d') . '-' .$fileName; 

// save image path 
$path = "../../img/".$randName; 
if (in_array($fileType, $permitted)) 
{ 
    $result = move_uploaded_file($tmpName, $path); 
     if (!$result) 
     { 
      echo "Error uploading image file"; 
      exit; 
     } 
    }      
    // update data 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    if ($fileName != null && $fileName != '') 
    { 
     $sql = "UPDATE users set username = ?, password = ?, email = ?, user_image = ? WHERE user_id = ?"; 
     $q = $pdo->prepare($sql); 
     $q->execute(array($username,$password,$email,$path,$user_id));       
    } 
    else 
    { 
     $sql = "UPDATE users set username = ?, password = ?, email = ? WHERE user_id = ?"; 
     $q = $pdo->prepare($sql); 
     $q->execute(array($username,$password,$email,$user_id)); 
    } 
    if (isset($_POST)) { 
     $_SESSION['edited'] = '<center><code>Done!</code></center>'; 
     } else { 
      $_SESSION['edited'] = false; 
     } 
     header('Location: users.php');      
    }    
    else 
    { 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sql = "SELECT * FROM users where user_id = ?"; 
    $q = $pdo->prepare($sql); 
    $q->execute(array($user_id)); 
    $data = $q->fetch(PDO::FETCH_ASSOC); 
    $username = $data['username']; 
    $password= sha1($data['password']); 
    $email = $data['email']; 
    $user_image = $data['user_image']; 
    Database::disconnect(); 
}       
?> 
<form role="form" action="" method="post" enctype="multipart/form-data"> 

<div class="form-group"> 
    User ID: <b><?php echo $user_id;?></b> 
</div> 

<!-- Text input--> 
<div class="form-group"> 
    <label for="username">Username</label> 
    <input value="<?php echo !empty($username)?$username:'';?>" id="username" name="username" class="form-control" type="text"> 
</div> 

<!-- File Button --> 
<div class="form-group"> 
    <label for="user_image">image</label> 
    <input id="userl_mage" name="user_image" class="input-file" type="file" value="<?php echo !empty($user_image)?$user_image:'';?>"> 
</div> 

<!-- File Button -->    
<div class="form-group"> 
    <label for="password">Password</label> 
    <input id="password" name="password" class="form-control" type="password" value="<?php echo !empty($password)?$password:'';?>"> 
</div> 

<!-- Text input--> 
<div class="form-group"> 
    <label for="email">Email</label> 
    <input id="email" name="email" class="form-control" type="text" value="<?php echo !empty($email)?$email:'';?>"> 
</div> 

我所看到的可能的解決辦法是顯示實際的密碼所以當表單submited和密碼沒有改變哈希相同的密碼。但我不想看到密碼。

任何想法如何做到這一點?

+1

讓密碼字段爲空。存儲的密碼在任何情況下都應該保持散列。當然,您需要檢查更新時是否設置了密碼字段,是否符合您的應用程序密碼標準。 –

+1

除了密碼相關的問題,我可以推薦這篇文章。它在教程中解釋瞭如何使用blowfish加密來安全地存儲密碼。 http://code.tutsplus.com/tutorials/understanding-hash-functions-and-keeping-passwords-safe-net-17577 – Ben

+0

是的Ben,我明白這一點,但我在@Arcturil解釋回答爲什麼我不想要並且在這個系統中需要「更高級」的加密。感謝您的教程順便說一句。 –

回答

3

讓密碼字段爲空。存儲的密碼在任何情況下都應該保持散列。當然,您需要檢查更新時是否設置了密碼字段,是否符合您的應用程序密碼標準。

在你的編程邏輯,你可以使用類似以下,以確保密碼貼:

if(isset($_POST["password"]) && !empty($_POST["password"])) { 
    // update in database 
} 
else { 
    // show error notification 
} 

注意,這樣使得任何密碼的大小和是不是很安全。但它可以防止輸入空密碼。有關篩選數據的更多信息,我認爲this是一個很好的參考。

2

顯示實際密碼非常不安全。你必須在你的數據庫中以純文本記錄它。我建議你有一個不同的頁面來更改密碼,在那裏你可以詢問實際的密碼,新的(2次)。或者將密碼字段留空以不更改實際密碼...在此字段中向用戶提示。因此,如果用戶填寫了某些內容,則不會更改密碼。

試試這個:

// update data 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

if ($fileName != null && $fileName != '') 
    $update_image = ", user_image='".$path."' "; 
else 
    $update_image = ""; 


if(isset($_POST["password"]) && !empty($_POST["password"])) 
    $update_password = ", password='".sha1($_POST['password'])."' "; 
else 
    $update_password = ""; 

$sql = "UPDATE users set username = ?, email = ? ". 
     $update_image.$update_password." WHERE user_id = ?"; 

$q = $pdo->prepare($sql); 
$q->execute(array($username,$email,$user_id));       
+0

我想要在同一個頁面上,所以只有第二頁才能更改密碼不是一個選項。所以你基本上建議在表單顯示時不在字段中加載密碼,如果是空字段則不要更新它。就像我現在在'if'條件下對圖像字段有什麼東西? –

2

密碼哈希值是根據定義,不可逆的(或接近你可以在密碼學中得到)。所以向客戶端顯示哈希值沒有任何用處。那麼這聽起來就像你在保存哈希時哈希了一樣。

首先,不要填充客戶端的密碼字段。散列意味着你沒有密碼

其次,它看起來像你正在使用舊的哈希系統。 SHA1或MD5。都不被認爲是安全的。現在,PHP現在具有更好的哈希系統。它叫做password_hash

+0

是的,它是'sha1'。我只想解決這個問題,我想在編輯表單上顯示密碼字段,但不想顯示任何密碼。問題是當字段爲空時在數據庫中更新爲空。但我不知道如何使這個領域的條件不更新在數據庫中。密碼哈希和安全我知道。只是這是一個封閉組用戶的小項目1-5,他們會使用它,並不需要這樣的高級加密。 –

+0

啊,舊的「但這只是一個小項目」的說法。沒有什麼比擁有一個「小」項目突然變得更加龐大的項目更糟了。你真正的問題是你只需要在密碼字段爲空時不更新密碼字段。從你的代碼不是很高的順序。 – Machavity

+0

再次感謝。實際上,在看到Ben發佈的教程之後,我認爲要放置哈希函數+將檢查空字段,如果爲空則不更新表。 –