2014-02-27 61 views
2

到目前为止,在我的MVC应用程序中,每次我想要获取资源时,都会将数据库ID包含在URI中。避免Uris上的数据库信息

:想象一下,对我们的产品的应用,这些产品中的一个具有ID 1,我可以访问的URI products/1

产品的细节。然而,这可能是一个问题,想象的ID可以更改。即使您认为id是主键并且不会更改,用户仍然可以获得有关1实际上是产品id的知识,并且该参数用于访问数据库。这可能会出现安全问题吗? 尽管如此,uri和数据库结构之间仍存在依赖关系。

(How)我可以创建一个不依赖于数据库并仍然可以访问该资源的uri吗?

+0

'用户仍然可以获得知识':我不认为这是一个问题,因为用户无法用产品'id'做任何事情。 –

+1

IMOHO,如果可以*以恶意的方式使用密钥,这只是一个“坏”的事情。例如,将ID用于未受保护的“帐户评论”URI将是非常糟糕的,例如,在哪里可以“猜测”接入点应该限制的信息。然而,正如SO所示,暴露一个ID(问题ID)和一个“漂亮”的标识符本身并没有什么错。 – user2864740

+0

另外,就URI的有效性而言,如果自动增量ID密钥更改,GUID密钥更改或者代理密钥更改,则没有差别 - 如果将密钥嵌入到其中,则仍然会导致先前的URL无效查找特定信息的URL。 – user2864740

回答

1

只需将一个关键字段添加到唯一的数据库表中即可。在查找数据时,请根据该字段而不是ID选择行。不,这确实不是更安全,但如果你愿意,很容易做到。做这个有效的一个原因是为了漂亮的网址。

UPDATE:

把任何功能在网站上天生就比不把它也不太安全。你基本上是问,'提供从网络中引用我的数据库中的特定项目的能力不太安全?'。答案是肯定的,但这并不意味着你不应该这样做。这意味着如果你想这样做,你需要小心,并确保你的网站是安全的。它是否知道试图访问该资源的人是他们自称的人?如果确实如此,并且我们已经决定这意味着他们应该可以访问,那么我们可以说它是安全的。访问资源的能力是一项功能;不是安全漏洞。

+0

你是否认为用户可以通过了解实际的产品'id'来做任何事情? –

+0

问题是uri与解决方案中的数据库结构有关。现在我可以通过密钥或ID访问数据库... –

+0

@BrunoCosta我的解决方案的另一个好处是,现在您可以重新命名该字段数据,并且该表不需要重新编制索引。只有一个索引会刷新。 – krowe