2009-11-17 66 views
2

大多数使用自动增量主键的站点都会在URL中公开显示它。一般总是一个好主意总是哈希唯一标识符的URL?

example.org/?id=5

这使得它很容易让任何人都可以蜘蛛网站,并通过简单地增加id的值收集所有的信息。我可以理解,在某些情况下,如果权限/身份验证设置不正确,任何人都可以通过简单猜测身份识别码来查看任何内容,但在某些情况下这是不好的事情,但它是否是好的的事?

example.org/?id=e4da3b7fbbce2345d7772b0674a318d5

是否有过在那里散列ID以防止爬行形势不好的做法(除了丢失需要设置此功能的时间)?或者这是一个有争议的话题,因为通过在网络上放置东西来接受被盗/被开采的风险?

回答

4

通常对于网站,您将尝试,以便他们轻松抓取并获取所有信息的访问权限,以便您可以获得良好的搜索排名并吸引访问您网站的流量。良好的Web开发人员在设计HTML时考虑到了搜索引擎,并且通常还提供RSS源和站点地图等内容,以便更容易地抓取内容。因此,如果您尝试通过不使用顺序标识符来使爬行更加困难,那么(a)您不会让它变得更加困难,因为爬虫通过跟踪链接工作,而不是通过猜测URL,以及(b)您尝试让事情变得更加困难,以至于你也花时间试图变得更容易,这是没有意义的。

如果您需要安全,请使用实际安全。使用对主体的检查来授权或拒绝对资源的访问。混淆网址完全没有安全性。

所以我没有看到使用数字标识符或任何值试图混淆它们的问题。

2

我认为可公开访问的id的散列并不是一件坏事,但是在某些情况下显示顺序id的意思是一件坏事。更好的是,为所有ID使用GUID/UUID。你甚至可以在很多技术中使用顺序GUIDS,所以速度更快(插入阶段)(虽然在分布式环境中并不如此)

3

在ID上使用像MD5或SHA这样的散列并不是一个好主意:

  • 总是有碰撞的可能性。也就是说,两个不同的ID散列到相同的值。
  • 你打算怎样把它摆回实际的ID?

如果您设置为避免递增ID,则更好的方法是在创建ID时使用GUID或随机值。也就是说,如果您的应用程序安全性依赖于不猜测ID的人,那么在系统的其他地方会显示一些缺陷。我的建议:坚持简单易用的自动递增ID并应用一些适当的访问控制。

+0

是的,使用MD5作为整数ID与使用整数ID相同,因为这两者之间有一个很好的一对一的对应关系。一个足够积极的用户可以拿出一个彩虹表(http:// www。freerainbowtables.com/en/tables/md5/),并使用MD5s而不是整数破解你的网址。 – Seth 2009-11-17 22:47:18

1

我的意见是,如果网络上有东西,并且没有经过授权就提供服务,它的目的是要公开访问。积极尝试让访问变得更加困难似乎违反了直觉。

0

我的一般规则是使用GUID,如果我显示的东西必须显示在URL中,并且还需要凭据访问或对特定用户(例如订单ID)是唯一的。 http://site.com/orders?id=e4da3b7fbbce2345d7772b0674a318d5

这样,另一个用户将无法通过黑客入侵下一个订单“偷看”。他们可能会被拒绝接触别人的订单,但向他们投掷数十亿个字母和数字是一种非常明确的方式,可以说“不要混淆这个”。

如果我显示的是公开的内容,而不是绑定到特定的用户,那么我可以使用整数键。例如,为了显示图片,您可能希望允许用户破解网址以查看下一张图片。

http://example.org/pictures?id=4http://example.org/pictures?id=5

(其实我不会做既可以作为一个简单的GET参数,我会使用mod_rewrite(或东西),使可读的URL喜欢的东西http://example.org/pictures/4 - >/pictures.php?picture_id=4等)

+1

IMO,如果另一个用户可以通过正确的URL“窥视”另一个订单,即使是一个模糊的URL,那么该软件也有一个**主要**安全漏洞。 – 2009-11-18 00:26:37

0

散列整数是安全性较差的实现,因此如果这是目标,那么真正的GUID甚至是“顺序”GUID(无论是通过NEWSEQUENTIALID()还是COMB算法)都好得多。

无论哪种方式,再也没有人会输入网址了,所以我没有太多的理由担心长度的差异。

1

通常,蜘蛛网站是一件好事。如果您希望尽可能提供您的信息,您希望Google等网站收集您网站上的数据,以便其他人可以找到它。

如果您不想让人们通读您的网站,请使用身份验证,并拒绝访问无权访问的人。

随机的URL只给人一种安全的印象,没有给出现实。如果您将帐户信息(隐藏)放入网址中,则每个人都可以访问该网站蜘蛛的帐户。

2

当您不希望URL可以穿越时,散列或随机化标识符或其他URL组件可能是一种好的做法。这不是安全性,但会阻止抓取工具使用(或滥用)您的服务器资源,并可帮助您确定何时发生。

通常,您不希望公开应用程序状态,例如未来将分配哪些ID,因为它可能允许攻击者以您未预先考虑的方式使用预测。例如,BIND的顺序交易ID是security flaw

如果您确实想要鼓励抓取或其他遍历,更严格的方法是提供链接,而不是提供可能在未来发生变化的实现细节。

使用顺序整数作为ID可以使许多事情在您的端更便宜,并且可能是一个合理的折衷。