1

クライアントへのフィッシング攻撃のリスクを軽減するために、サインイン シールを実装したいと考えています。私たちはクライアントに、私たちのサイトのレプリカではなく、彼が私たちのサイトにいることを知ってもらいたい. 一部の Web 検索で、Yahoo サインイン シール機能の例が見つかりました。そのようなシステムの実装について教えてもらえますか?

私が提案したい詳細は、具体的にはデータベースの設計と、メカニズムが Cookie やその他のもので機能するかどうか、および Yahoo サインイン シールよりも私たちの要件に対するより良い解決策があるかどうかです。

4

1 に答える 1

1

ユーザーがテキストを入力したり、画像を選択したりできるサイトの領域を用意します。この結果をユーザー ID に対してデータベースに保存します。

これが完了したら、この値を暗号化し、Cookie に設定します。

// Set a secret key
define('SECRET_KEY', 'HNBG:^yhCY*1omNhRg&');
// Sign in text - get this from the users row in the database
$signinSeal = 'Hello, User!';

// Encrypt value
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET_KEY, $signinSeal, MCRYPT_MODE_ECB, $iv);
// Concat with IV - base64 so it can be safely sent
$encrypted = base64_encode($iv) . '|' . base64_encode($encrypted);

// Set in a cookie - mark as HTTP only to prevent it being stolen in an XSS attack
setcookie('signinSeal', $encrypted, time() + (60 * 60 * 24 * 30), '/', 'example.com', false, true);

ユーザーがログイン ページにアクセスすると、「signinSeal」Cookie の存在を確認し、base64 でデコードし、復号化して表示します。

if (array_key_exists('signinSeal', $_COOKIE) && !empty($_COOKIE['signinSeal'])) {
    // Split IV and encrypted string
    $fields = explode('|', $_COOKIE['signinSeal']);
    $iv = base64_decode($fields[0]);
    $encrypted = base64_decode($fields[1]);
    // Decrypt value
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SECRET_KEY, $encrypted, MCRYPT_MODE_ECB, $iv);

    // And display to the user
    echo htmlspecialchars($decrypted);
}

ログインしたら、有効期限が切れないように、Cookie を再度設定します。

于 2012-07-18T10:00:49.370 に答える