有一个在 URL 中传递 id 值的典型网站。前任。 account.php?id=755
在 account.php 页面中我确实检查了值
$id = 0;
if(isset($_GET['id'])){
$id = intval($_GET['id']);
}
if($id == 0){
echo 'this account does not exists!';
exit();
}
但是,我正试图设法在显示值 755 之前对其进行加密,然后在检查该值之前对其进行解码。所以我没有显示实际的 ID,而是显示了一个掩码。
我的问题是: 1) 这是加密和解密 ID 的好主意吗?所以将传递一个掩码而不是实际的 id。 2) 是否有一种使用 PHP 返回仅包含数字和字母混合的字符串来加密 ID 的简单方法?
最佳答案
But, I am trying to find away to encrypt the value 755 prior displaying it and then decode it prior checking the value. So I am not displaying the the actual id but a mask.
这似乎是一个非常麻烦的想法。但是,如果它对您和安全意味着什么,那么您需要设计一种适合您的编码/解码方案。在最简单的层面上,您或许可以对 id 进行 base64_encode
,然后使用 base64_decode
对其进行解码。下面的例子只是说明性的。请根据您的需要进行清洁和调整。
$encrypted_id = base64_encode($id);
现在要取回它,只需运行 base64_decode
:
$decrypted_id = base64_decode($encrypted_id);
但这很容易破解。
更好的方法可能是创建一些 secret “盐”以添加到只有您的系统知道或理解的 ID。
$salt="MY_SECRET_STUFF";
$encrypted_id = base64_encode($id . $salt);
这样,如果 $id
解码不考虑盐,那么简单地使用 base64_decode
是没有意义的:
$decrypted_id = base64_decode($encrypted_id);
只有在解密过程中加入盐后,它才会有用地解码:
$decrypted_id_raw = base64_decode($encrypted_id);
$decrypted_id = preg_replace(sprintf('/%s/', $salt), '', $decrypted_id_raw);
逻辑是原始解密 ID 仍然混合了盐,preg_replace
会将其去除。因为只有你知道“盐”你猜怎么着?你很安全!但是当然,如果您出于某种原因放盐,您的整个系统将毫无用处,因为谁知道您的 ID 是什么。
但同样,除非保护用户 ID 是您应用的目标并且对安全性真正至关重要,否则这似乎过分了。如果有人猜出一个 ID,最糟糕的情况是什么?以及如何针对这种“最坏”的情况进行编程。
关于php - 如何保护在 URL 中传递的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914249/