Используя Php & MySQL, я хочу обновить все строки отдельного столбца в DataBase,
Например. : в колонке «Имя» есть строка, содержащая «MyName»,
Вот моя схема, которую я пытаюсь достичь и логика:
Loop База данных
Получить текущее значение для каждой строки и хэш с хешем ('…', value);
Получите существующие значения для каждой строки и хеш-файл & Update, это как я хочу обновить полную базу данных,
Как я могу это достичь?
Во-первых, я должен сказать, что если у вас есть нечувствительные данные в db, то встроенные функции mysql могут давать результаты хэшей напрямую с операторами обновлений, используя только mysql.
Этот ответ не об этом. Речь идет о конфиденциальных данных, таких как пароли.
Я дал вам ссылку на пример PHP password_hash()
и password_verify()
.
Вот эта ссылка снова. Эта ссылка влево для PDO. Следующая ссылка прямо здесь аналогична и для mysqli.
В ссылке PDO посмотрите на строку
$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using
Итак, скажем, теперь у вас есть столбец с открытым текстом, который называется ctPassword
. Вы alter table
бы alter table
и добавили новый столбец для чего-то вроде hashedPassword
. Следуйте этой ссылке, которую я предоставил, соответственно ctPassword
hashedPassword
значения ctPassword
в hashedPassword
с инструкцией по обновлению.
Затем тщательно проверьте его. Когда все будет правильно в мире, ctPassword
столбец ctPassword
и никогда не используйте его снова. Чтобы быть ясным , никогда не храните текстовые пароли в базах данных. Храните односторонние хеш-значения и проверяйте их. Вышеприведенные ссылки показывают, как.
Здесь полностью из PHP, где я думаю, что это нужно изгнать, в отличие от хэш-функций mysql, yuck. В конце концов, вы используете PHP, и именно там их сильное хеширование и проверка будут сиять. По моему мнению, лучшие практики, в то время как люди mysql точно не тратят на нее ментальную пропускную способность. Я все делаю как можно больше в mysql. Но никогда эта тема, используя хеши. Пусть PHP управляет этим.
create table sometable ( id int auto_increment primary key, userName varchar(40) not null, ctPassword varchar(40) not null -- clear text password (means humans can read it, basically) -- note, not a great definition of ct but it implies it has not been hashed for safety ); insert sometable(userName,ctPassword) values ('Brenda','I watch TV too much'), ('Drew','PatriotsWorldChamps'), ('stealth_guy','JFIDU&JF_Anchovies');
Наряду с идеей, эй, сейчас я хочу безопасные хеши. Я мог бы быть взломан.
-- http://dev.mysql.com/doc/refman/5.7/en/alter-table.html alter table sometable add column hashedPassword varchar(255); -- now I have 4 columns, hashedPassword is currently nullable show create table sometable; -- confirms this fact
PHP зацикливается и обновляет новый столбец, предназначенный для очистки до того, как не будет иметь концепцию хэша (что, я думаю, мы все видели в стеке 1M раз)
PHP для исправления:
<?php // turn on error reporting, or wonder why nothing is happening at times mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); //mysqli_report(MYSQLI_REPORT_ALL); error_reporting(E_ALL); ini_set("display_errors", 1); // Begin Vault // credentials from a secure Vault, not hard-coded $servername="localhost"; $dbname="login_system"; $username="dbUserName"; $password="dbPassword"; // End Vault try { $db = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db->prepare("select id,ctPassword from sometable"); $stmt->execute(); $stmt->bindColumn('id', $theId); // bind the results into vars by col names $stmt->bindColumn('ctPassword', $cPassword); // ditto // http://php.net/manual/en/pdostatement.fetch.php while ($row = $stmt->fetch(PDO::FETCH_BOUND)) { // as we loop thru here, the $theId and $cPassword variables will be auto-magically updated // for us because they have been bound as seen above $hPassword=password_hash($cPassword,PASSWORD_DEFAULT); // we now have a hashed password based on orig clear text one echo $cPassword . " " . $hPassword . "<br>"; // each time you run this with same data the hashes will be different due to changes in the salt // based on above PASSWORD_DEFAULT (look at manual page for password_hash) $sqlUpdate="UPDATE sometable set `hashedPassword`='$hPassword' where `id`=$theId"; $db->query($sqlUpdate); } // .. other cleanup as necessary } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit(); } ?>
Запустите php-скрипт, проверьте результаты. Это мои, ваши будут отличаться. Ваш будет отличаться от вашего, если вы запустите его снова. Причина, упомянутая в коде.
select * from sometable; +----+-------------+---------------------+--------------------------------------------------------------+ | id | userName | ctPassword | hashedPassword | +----+-------------+---------------------+--------------------------------------------------------------+ | 1 | Brenda | I watch TV too much | $2y$10$pJ5maui2OlrIPAtISf4u2OqeqEXU9ycDpCNNpp6xDh1uzIv/6ybuW | | 2 | Drew | PatriotsWorldChamps | $2y$10$kHAKRSeHLi9cghPKTKox/.kXiFgq6ELWwExGcVvbf1yYprtTvi.Ba | | 3 | stealth_guy | JFIDU&JF_Anchovies | $2y$10$HOkBAkP7ZVIZ7NQB50aKAuhG5WjLHU9AtJCiY2E6h/M2YZuxc2l5K | +----+-------------+---------------------+--------------------------------------------------------------+