在我自己开发的 CMS 控制面板中,如果您尝试访问一个 URL 并且没有登录,您将被重定向到一个如下所示的 URL(例如):/?return=Epf7psjPeRHeEsCoa56xvvF9QiaT%2B02P5FUSbA0Ttl%2Bv3LalZ26sqzSAV6WrNKNWK%2FDD%2FngSbVjJ%2FyUuG9QIWA%3D%3D
成功验证后,您将返回正确的 URL。如果您试图篡改这些数据,它会(以压倒性的可能性)将您踢到主页。
如果这就是你要找的,这就是我实现它的方式:
if ($_SERVER['REQUEST_URI'] !== '/') {
if (empty($_SESSION['cms_user_id_key_here'])) {
$encrypted = \Defuse\Crypto\Crypto::encrypt(
$_SERVER['REQUEST_URI'],
URL_KEY_CONST
);
header('Location: /?return='.urlencode(base64_encode($encrypted)));
exit;
}
}
然后,在成功登录后:
if (isset($_GET['return'])) {
try {
$decrypted = \Defuse\Crypto\Crypto::encrypt(
base64_decode($_GET['return'],
URL_KEY_CONST
);
// Defense-in-depth; we always want a relative URL:
if ($decrypted[0] === '/') {
header('Location: '.$decrypted);
} else {
header('Location: /');
}
} catch (\Defuse\Crypto\Exception\CryptoException $e) {
header('Location: /');
}
exit;
}
你问这是什么神秘\Defuse\Crypto\Crypto::encrypt()
的\Defuse\Crypto\Crypto::decrypt()
?当然是defuse/php 加密。
在几乎所有情况下,您都应该优先使用提供经过身份验证的加密的库,而不是滚动您自己的未经身份验证的加密。