将数据库主键公开给客户端

时间:2015-10-19 19:18:43

标签: mysql database

所以我有一个用Swift编写的iOS应用程序,它与一个带有SQL数据库的node.js服务器进行通信。该应用程序使用数据库ID从数据库中检索对象。因此,应用程序上的搜索功能将返回一组ID,并且应用程序使用所需对象的ID从服务器请求对象数据。

ID对应于对象表中的自动递增主键整数,例如:

CREATE TABLE database.events (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    description VARCHAR(1000) NOT NULL
);

从我所看到的,有些人认为这是一件非常糟糕的事情,而其他人则认为如果做得正确,这不应该是一个问题。我认为在我的例子中,后者是我同意的。事情'我的意思是将数据库ID暴露给前端(客户端应用程序)。

我的理解是这可能有两个主要问题:

  1. 如果黑客利用该应用程序并弄清楚它是如何制作的 向服务器请求他们可以发送请求的恶意请求 他们不应该被允许看到的数据。
  2. 自动递增ID可以显示用户数,有关的信息 企业可能拥有的客户和客户数量。
  3. 我认为这是唯一真正的问题吗?

    对于第一个,我已经(服务器端)进行了必要的检查,以确保用户无法请求或访问他们无权查看的数据。

    对于第二个问题,我想更多的是我发布这个问题的原因是如何优雅地处理这个问题。不可否认,它与在URL中公开的ID一样糟糕,因为它需要黑客攻击应用程序以查看它发送和接收的数据。但是我仍然认为这是一个问题,并且希望模糊ID以阻止任何人从ID中获取上述信息。

    我在考虑使用hash-id最初从自动递增ID创建一种哈希ID,但如果您只想生成我更喜欢的数字ID,他们建议使用Optimus。然后,应用程序客户端将使用此哈希ID来从服务器请求对象。

    我的问题是,这是一个理性而优雅的解决方案吗?有没有更好的办法?或者我是否错过了我正在创建的任何关键漏洞?

1 个答案:

答案 0 :(得分:3)

散列ID的想法很好,大多数数据库都使用GUID。另一方面,这些不提供任何安全性,它们只能帮助解决问题2.

有关详细信息,请参阅:http://blog.codinghorror.com/primary-keys-ids-versus-guids/

GUID(和许多哈希)的目标是唯一的,而不是加密安全(不可预测)。问题1只能通过实际的安全认证机制来解决。

请参阅:Is Microsoft's GUID generator cryptographically secure