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

  • Автор темы Feetrus9836
  • Дата начала
F

Feetrus9836

Шопмейкер
#1
добрый день
такой вопрос
может кто уже сталкивался и может помощь
сайт перенесли с джумлы, юзеры перенесены без паролей
теперь нужно сгенерировать для всех юзером пароли заново и записать их базу
их 10 тыс
нашел такой код
https://parzibyte.me/blog/en/2019/06/01/reset-opencart-password-manually-database/
но как применить пока что не знаю
 
Baco

Baco

architect
#2
Доброго времени, могу накидать скрипт для генерации, но, насколько я понимаю, нужен так же рассыльщик или, как минимум, какое то хранилище с привязкой юзер -> пароль, сам код организовать - не сложно, нужно только пару условий: поля из перенесённой базы пустые ? тоесть всех пользователей генерировать или только там, где поле с паролем пустое ? куда рассылать пароли (делать так же рассыльщик) ? делать модулем или однократным скриптом (первое стоит финансовой мотивации), второе, по принципу "залил, запустил, удалил" (чтобы злоумышленники не воспользовались), но без архитектурного стиля MVC и без какого либо вебинтерфейча, просто ссылка и запись вида "ок\error"
 
ТС
F

Feetrus9836

Шопмейкер
Топик Стартер #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 );

}
 
ТС
F

Feetrus9836

Шопмейкер
Топик Стартер #4
по сути нужно просто что бы записалось в базу и пользователь потом смог через страницу восстановления пароля поставить себе новый пароль
в базу перенесено имя почта телефон
 
Baco

Baco

architect
#5
данное решение НЕ ПРОПИСЫВАЕТ ПАРОЛИ, оно уведомляет по адресам (пустым) всех пользователей, чтобы сменили свои пароли!
сам файл назвал regen.php, ложить в корень сайта и запускать по урлу /regen.php?code=3245gjk345kjg523kj5, сам же code=3245gjk345kjg523kj5 можете менять на своё усмотрение в переменной $mycode, сделал чисто в целях безопасности, чтобы не злоупотребляли.
PHP:
<?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!';
проверять успешную отправку - в журнале ошибок!
 
Последнее редактирование:
ТС
F

Feetrus9836

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

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

Отправку писем решили не делать , владелец магазина боится блокировка от почтовиков
Просто сделает оповещения в соц сетях и на сайте что бы все сменили пароли
 
Baco

Baco

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