私の自家製の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-encryptionです。
ほとんどの場合、独自の認証されていない暗号化をロールするよりも、認証された暗号化を提供するライブラリを利用することを優先する必要があります。