安全:在网址中保护ID

时间:2012-07-20 00:19:57

标签: php symfony

我在编辑用户的帖子时使用以下网址:

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

为避免用户故意修改网址,例如/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');
}

这是编辑帖子时使用的一般方法吗?有没有办法做一些更清洁的事情,以便用户不能在网址中使用帖子的ID?

修改

我越是想到它,我就越发现我从未在一个关注安全性的网站上看到过像这样的网址中的id。所以,我同意我们仍然可以使用id并检查用户是否可以显示/看到此ID,但用户仍然可以做太多。 散列id不是更好,允许我们使用任何可用的算法生成新的加密ID:

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

在网址中保护ID的标准方法是什么?一般来说,在网址中显示类似ID的信息是个好主意吗?

8 个答案:

答案 0 :(得分:6)

特殊情况可能需要特殊措施,但在典型情况下,所有必要的是:

  • 使用SSL以便会话不会被窃听者劫持
  • 在执行任何操作之前检查用户的权限。

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

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

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

例如:

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

第一种方法的一个优点是人们可以使用书签返回页面。你可能不希望这样。或者你可以。取决于你的应用程序。

第二种方法的一个优点是(例如)Google Analytics不会透露是否正在反复访问/编辑一个帖子ID,或者是否正在访问/编辑许多帖子ID。这可能对您很重要,具体取决于此类信息是否可能告诉某人某些内容以及谁有权访问您的Google Analytics内容。或者它根本不重要。

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

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

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

没有一种适用于所有情况的最佳做法。但在典型情况下,没有必要对post id值进行哈希处理,甚至不需要通过POST发送它。在典型情况下,请确保使用SSL(以便不会劫持会话)并在执行任何操作之前检查用户权限,并且您很可能会去。

答案 1 :(得分:2)

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

如果在URL中容易看到或修改记录ID,这一点并不重要。重要的是可以用它做什么。除非id本身提供一些信息(这会令人惊讶),否则不需要隐藏它或使其混淆。只需确保您只回复经过身份验证和授权的请求。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

无论您是否对代码进行哈希处理,必须在编辑帖子时检查权限,否则某人可能会偶然发现他们不应该编辑的页面,并且可能导致严重损伤。这可以通过随机猜测,或通过浏览使用您的应用程序的其他用户的历史记录。

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

这并不是说你不能哈希你的ID,所以它们不是那么线性,而是看看流行的应用程序,如Wordpress,甚至Stack Overflow。它们都基于递增数字,因为无论是否知道ID,如果您没有权限,则无法编辑它。

答案 4 :(得分:1)

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

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

MD5'并不是一个好主意。破解它真的很容易,特别是如果它像md5(5684)。我在http://md5.noisette.ch/index.php查找了几个数字<100.000的哈希值,并找到了它们中的每一个。

答案 5 :(得分:1)

最好使用ACL。您可以将应用程序配置为拒绝所有内容,并使用ACL来访问特定对象。

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

答案 6 :(得分:1)

  1. 检查权限
  2. 不要将GET值用于验证,身份验证和授权。会话,帖子变量都可以。
  3. 让事情变得有趣...... $x =md5(random number + post_id + userid)当您返回编辑页面时,您会检查所有值,而/edit/3?id=$x&y=rand_number分别发送所有值。否则抛出异常。 如果您有兴趣,可以使用数据库更多的想法。

答案 7 :(得分:0)

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