2015-01-15 3 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> 

То, что я вижу, как это возможно исправить, чтобы показать фактический пароль поэтому, когда форма отправлена, а пароль не изменился на хэш-пароль такого же пароля. Но я не хочу видеть пароль.

Любые идеи, как это сделать?

+1

Пусть поле пароля пуст. Сохраненные пароли должны быть хэшированы при любых обстоятельствах. Конечно, вам нужно проверить, установлено ли поле пароля при обновлении и соответствует ли оно вашим стандартам пароля для приложений. –

+1

В дополнение к вопросам, связанным с паролем, я могу порекомендовать эту статью. В учебнике объясняется, как использовать шифрование blowfish для безопасного хранения ваших паролей. http://code.tutsplus.com/tutorials/understanding-hash-functions-and-keeping-passwords-safe--net-17577 – Ben

+0

Да, Бен, я понимаю это, но я объяснил в @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, я решил разместить функцию хэширования +, проверит пустое поле и не обновит таблицу, если она пуста. –

Смежные вопросы