4

当我编辑来自用户的帖子时,我使用以下网址:

../post/edit/3            //If the id of the post is 3 for example

为了避免用户故意修改 url,例如/post/edit/5,我使用以下逻辑来确保用户在没有权限时不会编辑帖子:

if (//user is allowed to edit post){
    //edit post
}
else {
    throw new AccessDeniedException('You do not have the permission to edit this post');
}

这是您在编辑帖子时使用的一般方法吗?有没有办法做一些更清洁的事情,这样用户就不能在 url 中使用帖子的 id 了?

编辑

我想得越多,我就越意识到我从来没有在一个关注安全的网站中看到像这样的 url 中的 id。所以,我同意我们仍然可以使用 id 并检查用户是否可以显示/看到这个 id,但用户仍然可以做太多事情。对 id 进行哈希处理不是更好吗,允许我们使用任何可用的算法生成一个新的加密 ID:

<?php
echo hash('md5', 'id_to_edit');
?>

保护 url 中的 id 的标准方法是什么?一般来说,在 url 中显示像 id 这样的信息是个好主意吗?

4

8 回答 8

6

特殊情况可能需要采取特殊措施,但在典型情况下,只需:

  • 使用 SSL,这样会话就不会被窃听者劫持
  • 在做任何事情之前检查用户的权限。

许多网站的做法与您最初描述的方式相似。例如,WordPress 有类似https://example.com/wp-admin/post.php?post=112&action=edit. 显然,好奇的用户可以选择编辑该post=112部分。

因此,您可能会考虑的一个标准是:“我是否需要比 WordPress 更关注安全和隐私?”

例如,如果您不希望查看日志文件的人知道哪些 IP 地址正在编辑哪些帖子,那么您有几个选择。每种方法都有权衡,因此最好的方法取决于您最关心的问题。

例如:

  • 您可以使用哈希来隐藏帖子 ID 号,就像您在更新问题时建议的那样。
  • 或者,您可能只是通过 SSL 上的 POST 方法(而不是 GET)发送该信息,而根本不将其包含在您的 URL 中。

第一种方法的一个优点是人们可以使用书签返回页面。你可能不想要那个。或者你可能会。取决于您的应用程序。

第二种方法的一个优点是(例如)Google Analytics 不会显示一个帖子 ID 是否被一遍又一遍地访问/编辑,或者是否有许多帖子 ID 被访问/编辑。这可能对您很重要,具体取决于此类信息是否会告诉某人某事以及谁有权访问您的 Google Analytics(分析)资料。或者它可能根本不重要。

还有很多其他可能的考虑因素,例如性能。

顺便说一句,如果您使用 MD5,请确保在输入中包含攻击者不知道的内容。否则,攻击者通过查找表反转已发现的哈希并为连续的帖子 ID 生成进一步的合法哈希将是微不足道的。在 PHP 中,您需要执行以下操作:

hash('md5', $some_hard_to_guess_secret_string . $data_you_wish_to_hash);

没有适用于所有情况的单一最佳实践。但在典型情况下,不需要对 post id 值进行哈希处理,甚至不需要通过 POST 发送。在典型情况下,请务必使用 SSL(这样会话就不会被劫持)并在执行任何操作之前检查用户权限,您可能会很顺利。

于 2012-07-25T04:38:40.087 回答
3

必须将来自客户端的所有数据视为可疑数据。这包括 URL。您应该检查该客户端是否确实经过身份验证,并且他有权执行指示的任何操作(通过 URL、发布数据等)。即使您只显示数据而不更改数据也是如此。

记录 ID 在 URL 中是否容易看到或修改并不重要。重要的是可以用它做什么。除非 id 本身传递了一些信息(这会令人惊讶),否则没有必要隐藏它或混淆它。只需确保您只响应经过身份验证和授权的请求。

于 2012-07-25T05:12:19.847 回答
2

这是标准方法。您应该始终检查以下两者的权限:显示表单和提交表单后的操作。

于 2012-07-20T00:28:16.437 回答
2

无论您是否对 ID 进行哈希处理,在编辑帖子时都必须检查权限,否则有人可能会偶然发现他们不应编辑的页面,并可能造成严重损害。这可以是通过随机猜测,也可以是通过浏览另一个使用您的应用程序的用户的历史记录。

在允许某人编辑某些内容之前检查权限

这并不是说您不能散列您的 ID,因此它们不是线性的,而是看看流行的应用程序,例如 Wordpress,甚至是 Stack Overflow。它们都是基于递增的数字,因为无论是否知道 ID,如果您没有权限,则无法对其进行编辑。

于 2012-07-25T04:32:05.543 回答
2
  1. 检查权限
  2. 不要将 GET 值用于验证、身份验证和授权。会话,发布变量都可以。
  3. 让事情变得有趣...$x =md5(random number + post_id + userid)单独发送所有值,就像/edit/3?id=$x&y=rand_number当您返回编辑页面时检查所有内容一样。否则给他们一个异常。还有一些想法涉及 db 但如果您有兴趣。
于 2012-07-25T18:29:13.223 回答
1

混淆 ID 不会增加安全性。如前所述 - 您应该始终检查权限。

您可能会有这样的印象,即您没有在关注安全的网站中看到这样的 url,因为其中一些网站通常运行在 Java 或 .Net 之类的东西上,并且使用 GUID ( http:/ /en.wikipedia.org/wiki/Globally_unique_identifier)。然而,其中一些使用顺序 ID(例如,gmail 使用顺序 ID 来处理电子邮件)。

MD5'ing 不是一个好主意。破解它真的很容易,尤其是像 md5(5684) 这样的东西。我在这里http://md5.noisette.ch/index.php查找了几个 <100.000 的哈希值,它找到了它们中的每一个。

于 2012-07-25T05:18:00.220 回答
1

为此使用ACL会更好。您可以将应用程序配置为拒绝一切,并使用 ACL 授予对特定对象的访问权限。

在 URL 中不使用任何哈希而不是 id 是一种常见的做法。Clean id 允许您使用简单的命令 grep apache 日志、应用程序日志。所有逻辑都必须在代码中以授予或拒绝对特定域实体的访问权限。

于 2012-07-25T17:48:15.097 回答
0

你需要比检查已经确认他们是谁(登录)的用户是否有权编辑相关帖子更安全?如果您只是在地址栏中显示了一个散列值,那么找到散列算法仍然相对容易,然后他们仍然可以控制他们试图编辑的帖子。默默无闻的安全永远是一种虚假的安全感。

于 2012-07-25T04:52:52.413 回答