1

これは、ログイン画面を経由せずに prestashop にユーザーをログインさせる方法のチュートリアルです。これは、セッションを 1 つの Web サイトから prestashop に転送する場合のように、ユーザーに再度ログインさせたくない場合に役立ちます。

ステップ 1 パスワードのソルティングを不要にします。config/settings.inc.php で、_COOKIE_KEY_ を空白に設定します。これは、新しい顧客を作成する必要があることも意味することに注意してください。または、DB から古い 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[] のいずれかを使用して、ユーザー名/パスワードにアクセスできます。いずれにせよ、それは大きなセキュリティリスクです。Cookie の読み取りは、index.php ファイルに配置できます。

4

1 に答える 1

2

あなたが提案したこのアプローチは非常に安全ではありません。パスワードの安全性のためにソルトが必要であり、絶対に削除しないでください。さらに、MD5 ハッシュでユーザーを認証することにより、パスワードのハッシュによって提供されるすべての保護を事実上無効にします。SQL インジェクションなどの攻撃により、攻撃者がこのハッシュを取得して解読する必要があるため、人々はパスワードをハッシュします。このシナリオでは、攻撃者は管理者のハッシュを取得して、すぐにログインできます。

セッション共有を行う正しい方法:

セッション状態を格納する単純なテーブルを作成します。この場合、Cryptgoraphic Nonceは、データの参照に使用される大きなランダム値です。

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

ブラウザが別のショップにリダイレクトされたら、次のようにリダイレクトします。

header('location: https://some_other_shop/landing.php?token=$cryptographic_nonce');

新しいサーバーがこのランディング リクエストを受け取ると、以前のサーバーからセッション状態をフェッチします。

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

データベース内のユーザーのデータも転送する必要がある場合があることに注意してください。

于 2010-11-02T08:12:17.100 に答える