4

有一个在 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?

4

6 回答 6

13

但是,我试图在显示 755 之前对其进行加密,然后在检查该值之前对其进行解码。所以我没有显示实际的 id 而是一个面具。

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

$encrypted_id = base64_encode($id);

现在要取回它,只需运行base64_decode

$decrypted_id = base64_decode($encrypted_id);

但这很容易破解。

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

$salt="MY_SECRET_STUFF";
$encrypted_id = base64_encode($id . $salt);

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

$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,最坏的情况是什么?以及如何针对“最坏”情况进行编程。

于 2013-11-11T19:44:45.823 回答
1

那么你可以做的一件事来掩盖实际的 id 就是散列它。例子:

生成链接:

<a href='script.php?id='<?php echo hash('sha256',$id); ?>'>click me</a>

然后在 script.php 参考hash('sha256',$_GET['id'])

或者,如果您需要更直接地访问实际值,您可以使用mcrypt_encryptmycrypt_decrypt 。

于 2013-11-11T19:34:15.920 回答
1

除了混淆您正在传递的 id 之外,真的没有其他意义。这实际上不是任何一种安全措施。即使对 id 进行了编码,攻击者仍然可以猜测它们。

根据经验,您应该将所有这些信息视为公开的。如果您试图阻止访问,您应该考虑设置会话。

于 2013-11-11T19:36:15.653 回答
0

1-(回复评论)GET 允许 URL 引用,POST 与 GET 一样安全。您可以随时轻松地使用 Firefox 扩展来修改该值。要求它避免使用就像要求某人添加 JS 验证以保护页面。它会保护你免受常客的攻击,而不是聪明的人。

2-我知道这看起来像是一项家庭作业,您的选择可能受到限制/将这样做,但您不应该依赖“逐步”验证。并不是说它们不起作用,而是如果您忘记添加某些内容,它们在受到攻击时通常很脆弱。在您添加一堆新元素后,它们还会给您一个非常混乱的代码。

不要试图隐藏您的客户正在访问的页面,而是检查谁是 ID 的所有者以及谁在尝试访问它(使用服务器端登录)

3- 如果你只是想要一些简单但很酷的东西,检查 base64_encode(),它实际上并不安全,但它是完成工作的简单方法。

于 2013-11-11T19:40:12.050 回答
0

由于 url 是 account.php?id=755 我假设你想阻止用户“监视”除他们自己的任何其他帐户。在这种情况下混淆 id 是没有意义的。

将 id 存储在用户会话中,并让 account.php 从那里检索它,因此用户将只能看到它自己的帐户页面。

于 2013-11-11T19:41:38.620 回答
0

你不应该这样做的原因:

  • GET 请求被缓存并且可以轻松复制/粘贴...导致您显示的页面在用户之间共享并允许其他任何人访问该页面
  • 你不会让它更安全

为什么应该这样做(可以推翻上述):

  • 出于竞争原因,您不想向客户显示 orderNumber=xxxx,因为竞争对手可能会猜测您的收入

解决方案:

于 2013-11-11T19:53:03.833 回答