CommerCentr
UA
Увійти

Сброс паролей для всех юзеров

#1
добрый день
такой вопрос
может кто уже сталкивался и может помощь
сайт перенесли с джумлы, юзеры перенесены без паролей
теперь нужно сгенерировать для всех юзером пароли заново и записать их базу
их 10 тыс
нашел такой код
https://parzibyte.me/blog/en/2019/06/01/reset-opencart-password-manually-database/
но как применить пока что не знаю
#2
Доброго времени, могу накидать скрипт для генерации, но, насколько я понимаю, нужен так же рассыльщик или, как минимум, какое то хранилище с привязкой юзер -> пароль, сам код организовать - не сложно, нужно только пару условий: поля из перенесённой базы пустые ? тоесть всех пользователей генерировать или только там, где поле с паролем пустое ? куда рассылать пароли (делать так же рассыльщик) ? делать модулем или однократным скриптом (первое стоит финансовой мотивации), второе, по принципу "залил, запустил, удалил" (чтобы злоумышленники не воспользовались), но без архитектурного стиля MVC и без какого либо вебинтерфейча, просто ссылка и запись вида "ок\error"
#3
исходя из своих скромных знаний собрал вот такое

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);



function token($length = 32) {
$string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

$max = strlen($string) - 1;

$token = '';

for ($i = 0; $i < $length; $i++) {
$token .= $string[mt_rand(0, $max)];
}

return $token;
}

function generar_pass($passTextoPlano){
$sal = token(9);
$hash = sha1($sal . sha1($sal . sha1($passTextoPlano)));
return [
"sal" => $sal,
"hash" => $hash,
];
}

$mysqli = new mysqli("localhost", "test", "test", "test");



$sql = mysqli_query($mysqli, 'SELECT * FROM `oc_customer`');
while ($result = mysqli_fetch_array($sql)) {

$id_user = $result['customer_id'];
$name_user = $result['firstname'];
$email_user = $result['email'];
$phone_user = $result['telephone'];

$datosPass = generar_pass("123456");
$pass = $datosPass["hash"];
$sal = $datosPass["sal"];

printf("%s;%s;%s;%s;%s;%s;\n", $id_user, $name_user, $email_user, $phone_user, $pass, $sal );

}
#4
по сути нужно просто что бы записалось в базу и пользователь потом смог через страницу восстановления пароля поставить себе новый пароль
в базу перенесено имя почта телефон
#5
данное решение НЕ ПРОПИСЫВАЕТ ПАРОЛИ, оно уведомляет по адресам (пустым) всех пользователей, чтобы сменили свои пароли!
сам файл назвал regen.php, ложить в корень сайта и запускать по урлу /regen.php?code=3245gjk345kjg523kj5, сам же code=3245gjk345kjg523kj5 можете менять на своё усмотрение в переменной $mycode, сделал чисто в целях безопасности, чтобы не злоупотребляли.
<?php 

/*
/ ReGenerate && submit by email password reset
/ autor: Baco <baco@brocart.net>
/ 21.08.2021: run: YOU_DOMAIN /regen.php?code=3245gjk345kjg523kj5
*/

$mycode = '3245gjk345kjg523kj5';

if (!isset($_SERVER['DOCUMENT_ROOT']) || $_SERVER['DOCUMENT_ROOT'] == false) {
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);
}

if (!isset($_GET['code']) || ($_GET['code'] != $mycode)) {
exit(0);
}

require_once($_SERVER['DOCUMENT_ROOT'] . '/config.php');
require_once(DIR_SYSTEM . 'startup.php');

$registry = new Registry();
$config = new Config();
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$query = $db->query("SELECT * FROM `" . DB_PREFIX . "setting` WHERE store_id = '0' ORDER BY store_id ASC");
foreach ($query->rows as $result) {
if (!$result['serialized']) {
$config->set($result['key'], $result['value']);
} else {
$config->set($result['key'], json_decode($result['value'], true));
}
}

$logger = new Log($config->get('config_error_filename'));

$query = $db->query("SELECT email FROM " . DB_PREFIX . "customer WHERE password IS NULL OR LTRIM(RTRIM(password)) = '' ORDER BY email DESC");

if ($query->num_rows) {
foreach ($query->rows as $client) {
$code = gen(40);
$mail = new Mail($config->get('config_mail_engine'));
$template = new Template('twig');
$db->query("UPDATE `" . DB_PREFIX . "customer` SET code = '" . $code . "' WHERE LCASE(email) = '" . $db->escape(utf8_strtolower($client['email'])) . "'");
send($config, $code, $client['email'], $mail, $template, $logger);
}
}

function send($config, $code, $email, $mail, $template, $logger) {
$data['text_greeting'] = 'Здравствуйте! Поменяйте пароль перейдя по указанной ссылке!';
$data['reset'] = HTTPS_SERVER . 'index.php?route=common/reset&code=' . $code;
$data['ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
$mail->parameter = $config->get('config_mail_parameter');
$mail->smtp_hostname = $config->get('config_mail_smtp_hostname');
$mail->smtp_username = $config->get('config_mail_smtp_username');
$mail->smtp_password = html_entity_decode($config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8');
$mail->smtp_port = $config->get('config_mail_smtp_port');
$mail->smtp_timeout = $config->get('config_mail_smtp_timeout');
$mail->setTo($email);
$mail->setFrom($config->get('config_email'));
$mail->setSender(html_entity_decode($config->get('config_name'), ENT_QUOTES, 'UTF-8'));
$mail->setSubject('Просьба поменять пароль, для входа в кабинет!');
foreach ($data as $key => $value) {
$template->set($key, $value);
}
$mail->setText($template->render($config->get('theme_default_directory') . '/template/mail/forgotten'));
$mail->send();
$logger->write('успешно выслано для: ' . $email);
}

function gen($length = 32) {
$string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$max = strlen($string) - 1;
$token = '';
for ($i = 0; $i < $length; $i++) {
$token .= $string[mt_rand(0, $max)];
}
return $token;
}
echo 'Job well done, bro!';

проверять успешную отправку - в журнале ошибок!
#6
Спасибо большое за решение
Проблемам была в том что перенесли 10 тыс юзеров только в именем, почтой и телефоном
А в таблице же ещё пароль и salt должны быть

Я немного дописал свой корявый код и сгенерировано все в файл ну и загрузил потом в базу

Отправку писем решили не делать , владелец магазина боится блокировка от почтовиков
Просто сделает оповещения в соц сетях и на сайте что бы все сменили пароли
#7
Как вариант ваше решение годится, главное - результат.
я бы предложил всеравно, сделать какой то "крон" файл и поставить, например, на срабатывание раз в 15 минут, где рассылать порциями по 5-7 оповещений пользователям, с проставлением какого то маркера сразу в базу по типу "оповещен" и так по всему списку.

Читати може будь-хто. Щоб писати й голосувати — увійдіть в акаунт.