在我的管理页面中,我有可以编辑用户页面的表单。当我加载编辑页面和表单时,我也从数据库加载信息,因为如果字段为空,它们在提交表单后也会在数据库中变空。
问题在于密码字段。加载表单时,密码字段为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>
我认为可能的修复方法是显示实际密码,这样当表单被提交并且密码没有更改为哈希相同的密码时。但我不想看密码。
任何想法如何制作?
答案 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