Функция ниже - это то, что я написал для динамической вставки данных формы в базу данных с помощью PDO, она захватывает имя формы и значение attr для заполнения столбцов и bindValues ​​в операторе вставки PDO. Проблема, с которой я столкнулся сейчас, заключается в следующем:

Я хочу хешировать пароль перед вставкой, а также одновременно вставлять время и дату.

 public function reg_user($data) {
            if($_SERVER['REQUEST_METHOD'] == 'POST'){
                $dataDB = array();
                foreach ($_POST as $k => $v) {
                  if (in_array($k,$this->valid_keys)) {
                     $dataDB[$k] = $v;
                  }
                }
        $this->cols    =  '`'.implode('`, `', array_keys($dataDB)).'`' ;
        $this->values  = ':' . implode(", :", array_keys($dataDB));
        $db = new  db;
              try{
                    $stmt = $db->dbh->prepare ("INSERT INTO $this->table ($this->cols ) VALUES ($this->values)");
                    foreach ($dataDB as $k => $v) {
                          $stmt -> bindValue(':'.$k, $v);
                 }
    $stmt->execute();
} catch (PDOException $e) {
    $error = new Errors();
    echo "<b>".$error->displayError($e)."</b>";
}

}
}

Я изменил цикл foreach на этот

  foreach ($_POST as $k => $v) {
                  if (in_array($k,$this->valid_keys)) {
                    if($k == 'password'){
                      $v = password_hash($v , PASSWORD_DEFAULT);
                    }
                     $dataDB[$k] = $v;
                  }
                }

Но я все еще получаю простой пароль, вставленный в базу данных.

0
hello 19 Май 2014 в 20:16

2 ответа

Лучший ответ

Это MySQL? Если да, то есть несколько способов сделать это, не используя код:

http://www.w3schools.com/sql/func_now.asp

http://www.kbedell.com/writing-projects/

Что касается хеширования пароля, в вашем цикле прослушивание ключа пароля создает особый случай, когда вы устанавливаете значение вставки на хешированное значение. Возможно, вы могли бы создать общий «чистый» метод, который также передавал бы все значения - по крайней мере, эта «чистая» функция избегала бы всех вставляемых данных для вредоносного кода инъекции, и она также могла бы выполнять любые специальные преобразования, не загромождая метод вставки Вы показываете:

>  foreach ($_POST as $k => $v) {
>                   if (in_array($k,$this->valid_keys)) {
>                      $dataDB[$k] = clean($k, $v);
>                   }
>                 }

Clean может выглядеть примерно так:

function clean($key, $val){
  if($key=="password")
  {
    $val = //hash pword here
  }
   return addslashes($val); //using addslashes as basic example
}

Клянусь, в прошлом я писал код, который почти идентичен вашему. Это довольно хороший подход. Вы действительно сталкиваетесь с проблемой особого случая для каждого ключа, такого как пароль, поэтому автоматизация таких вещей, как даты, может быть полезна.

В качестве альтернативы вы можете использовать Now () при вставке каждой записи. Это немного менее элегантно и действительно не работает с этими ORM-вставками.

Если не Mysql, другие базы данных имеют аналогичные подходы, пример postgres очень похож на метод w3schools.

2
picus 19 Май 2014 в 16:41

В цикле проверьте, является ли ключ паролем, затем хешируйте его, как показано ниже

foreach ($_POST as $k => $v) {

    if (in_array($k,$this->valid_keys)) {
     $dataDB[$k] = ($k=="password")?md5($v):$v;
    }
}
//here add the date to the array like below

$dataDB["datetime"]=date('d-m-y H:i:s');

Или сделайте столбец datetime как timestamp в вашей таблице (тогда он автоматически добавит дату и время в эту строку)

1
ɹɐqʞɐ zoɹǝɟ 19 Май 2014 в 16:25