更新数据库中的字段

时间:2015-01-15 13:06:34

标签: php mysql

在我的管理页面中,我有可以编辑用户页面的表单。当我加载编辑页面和表单时,我也从数据库加载信息,因为如果字段为空,它们在提交表单后也会在数据库中变空。

问题在于密码字段。加载表单时,密码字段为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>

我认为可能的修复方法是显示实际密码,这样当表单被提交并且密码没有更改为哈希相同的密码时。但我不想看密码。

任何想法如何制作?

3 个答案:

答案 0 :(得分:3)

让密码字段为空。存储的密码应该在任何情况下保持散列。当然,您需要检查更新时是否设置了密码字段,以及它是否符合您的应用程序密码标准。

在您的编程逻辑中,您可以使用以下内容来确保密码已发布:

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

请注意,这允许任何密码大小,并且不是很安全。但它阻止输入空密码。有关过滤数据的详细信息,我认为this是一个很好的参考。

答案 1 :(得分:2)

显示实际密码非常不安全。您必须在DB中以纯文本格式记录它。我建议您使用不同的页面来更改密码,您可以在其中询问实际密码和新密码(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));                          

答案 2 :(得分:2)

根据定义,密码哈希值是不可逆的(或者尽可能接近密码术)。因此向客户端显示哈希没有任何意义。然后听起来就像你在保存它时散列哈希值。

首先,永远不要填写客户端的密码字段。散列意味着你无论如何都没有密码

其次,看起来你正在使用较旧的散列系统。 SHA1或MD5。两者都不被认为是安全的。 PHP现在具有更好的哈希系统。它被称为password_hash