Noob способ авторизации пользователя в Prestashop - PullRequest
1 голос
/ 16 октября 2010

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

Шаг 1 Устранить необходимость посола пароля. В config / settings.inc.php установите _COOKIE_KEY_ пустым. Обратите внимание, это также означает, что вы должны создать нового клиента. Или вы можете удалить старый пароль md5 из БД и добавить свой собственный.

Шаг 2 В файле authentication.php вставьте следующие строки после строки 6:

                    $customer = new Customer();
                    //$authentication = $customer->getByEmail(trim($email), trim($passwd));
                    $authentication = $customer->getByMd5(trim($email), trim($passwd)); //modified version of getByEmail if we are not accepting  $passwd in cleartext but in md5.
                    /* Handle brute force attacks */
                    sleep(1);
                    if (!$authentication OR !$customer->id)
                        $errors[] = Tools::displayError('authentication failed');
                    else
                    {
                        $cookie->id_customer = intval($customer->id);
                        $cookie->customer_lastname = $customer->lastname;
                        $cookie->customer_firstname = $customer->firstname;
                        $cookie->logged = 1;
                        $cookie->passwd = $customer->passwd;
                        $cookie->email = $customer->email;
                        if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0))
                            $cookie->id_cart = intval(Cart::lastNoneOrderedCart(intval($customer->id)));
                        Module::hookExec('authentication');
                        if ($back = Tools::getValue('back'))
                            Tools::redirect($back);
                        //Tools::redirect('my-account.php'); //cut redirection to break infinite loop
                    }

Приведенный выше код позволяет пользователю войти в систему, используя $ email в качестве имени пользователя и $ passwd в качестве пароля в виде открытого текста. Оригинальный код взят из функции if (Tools::isSubmit('SubmitLogin')) внутри файла authentication.php.

Шаг 3 Вставьте приведенный выше код в файл products.php сразу под строкой 5

Шаг 4 В случае, если вы отправляете $ passwd напрямую в формате md5, вот модифицированная версия getByEmail () (customer.php):

public function getByMd5($email, $passwd = NULL)
    {    
        $result = Db::getInstance()->GetRow('SELECT * FROM `'._DB_PREFIX_   .'customer` WHERE `active` = 1 AND `email` = \''.pSQL($email).'\'  '.(isset($passwd) ? 'AND `passwd` = \''.pSQL(_COOKIE_KEY_.$passwd).'\'' : '').' AND `deleted` = 0');

        if (!$result)
            return false;
        $this->id = $result['id_customer'];
        foreach ($result AS $key => $value)
            if (key_exists($key, $this))
                $this->{$key} = $value;

        return $this;       
    }

Вы можете получить доступ к имени пользователя / паролю через функцию $ _COOKIE [] или через $ _GET []. В любом случае это большой риск для безопасности. Чтение куки может быть помещено в файл index.php.

1 Ответ

2 голосов
/ 02 ноября 2010

Такой подход, который вы предложили, крайне небезопасен.Соль требуется для безопасности пароля и никогда не должна быть удалена.Более того, аутентифицируя пользователя с помощью его хэша MD5, вы фактически аннулируете все средства защиты, которые предоставляет вам хеширование паролей.Люди хэшируют пароли, потому что такие атаки, как инъекция SQL, позволяют злоумышленнику получить этот хэш, который затем необходимо взломать.В этом сценарии злоумышленник может получить хеш администратора и сразу войти в систему.

Правильный способ совместного использования сеанса:

Создание простой таблицы для хранения состояния сеанса,В этом случае Cryptgoraphic Nonce - это большое случайное значение, используемое для ссылки на данные.

'insert into session_state (sess,token) value ('.pSQL(serialize($_SESSION)).', '.$cryptographic_nonce.')'

Когда браузер перенаправлен в другой магазин, перенаправьте его следующим образом:

header('location: <a href="https://some" rel="nofollow">https://some</a>_other_shop/landing.php?token=$cryptographic_nonce');

Когда новый сервер получитэтот запрос на посадку извлекает состояние сеанса с предыдущего сервера:

$sess=http_get($_SERVER['HTTP_REFERER']."?token=$_GET[token]"); $_SESSION=unserialize($sess);

Обратите внимание, что вам, возможно, придется также передавать данные пользователя в базу данных.

...