如何保护URL中传递的id?

Jay*_*len 3 php encryption

有一个典型的网站传递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();
}
Run Code Online (Sandbox Code Playgroud)

但是,我试图在显示之前找到加密值755然后在检查值之前对其进行解码.所以我没有显示实际的id而是掩码.

我的问题是:1)加密和解密ID是一个好主意吗?所以将传递一个掩码,而不是实际的id.2)是否有一种简单的方法来加密id,方法是使用PHP返回一个只混合了数字和字母的字符串?

Jak*_*uld 8

但是,我试图在显示之前找到加密值755然后在检查值之前对其进行解码.所以我没有显示实际的id而是掩码.

这似乎是一个非常麻烦的想法.但是,如果它对你和安全有意义,那么你需要设计一个适合你的编码/解码方案.在最简单的级别上,您可以base64_encode使用id,然后使用它进行解码base64_decode.以下示例仅是说明性的.请根据您的需求进行清洁和调整.

$encrypted_id = base64_encode($id);
Run Code Online (Sandbox Code Playgroud)

现在回来,运行base64_decode:

$decrypted_id = base64_decode($encrypted_id);
Run Code Online (Sandbox Code Playgroud)

但这很容易破解.

更好的方法可能是创建一些秘密的"盐"来添加到只有您的系统知道或理解的ID.

$salt="MY_SECRET_STUFF";
$encrypted_id = base64_encode($id . $salt);
Run Code Online (Sandbox Code Playgroud)

以这种方式,base64_decode如果$id解码不考虑盐,简单地使用是没有意义的:

$decrypted_id = base64_decode($encrypted_id);
Run Code Online (Sandbox Code Playgroud)

它只会在解密过程中使用您的salt进行有效解码:

$decrypted_id_raw = base64_decode($encrypted_id);
$decrypted_id = preg_replace(sprintf('/%s/', $salt), '', $decrypted_id_raw);
Run Code Online (Sandbox Code Playgroud)

逻辑是原始的解密ID仍然混合了盐,并将其preg_replace剥离.既然只有你知道'盐'猜什么?你很安全!但是当然如果你出于某种原因放松盐,你的整个系统都是无用的,因为谁知道你的ids.

但同样,这似乎是过分的,除非保护用户ID是您的应用程序的目标,并且对安全性至关重要.如果有人猜到身份证可能会发生什么?你如何针对那个"最糟糕"的情景进行编程.