我们希望实施签章以降低对客户端进行网络钓鱼攻击的风险。我们希望客户知道他在我们的网站上,而不是我们网站的某些副本。一些网络搜索为我们提供了 Yahoo Sign-in-seal 功能的示例。你们能指导我实施这样的系统吗?
我想对具体的数据库设计提出建议,以及机制是否适用于 cookie 或其他东西,以及是否有比雅虎登录印章更好的解决方案来满足我们的要求。
我们希望实施签章以降低对客户端进行网络钓鱼攻击的风险。我们希望客户知道他在我们的网站上,而不是我们网站的某些副本。一些网络搜索为我们提供了 Yahoo Sign-in-seal 功能的示例。你们能指导我实施这样的系统吗?
我想对具体的数据库设计提出建议,以及机制是否适用于 cookie 或其他东西,以及是否有比雅虎登录印章更好的解决方案来满足我们的要求。
有一个网站区域,用户可以在其中输入一些文本或选择图像。根据用户 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,以确保它不会过期