C# 如何从HTML/Javascript中隐藏数据库ID

C# 如何从HTML/Javascript中隐藏数据库ID,c#,javascript,.net,security,url,C#,Javascript,.net,Security,Url,显然,根据返回到web前端的数据的类型/上下文(在我的例子中,设置为HTML/Javascript、.NET Csharp后端和JSON作为数据传输),如果我必须返回一个ID,比如一条消息的ID是自动生成的主键(Int64),那么“隐藏”这个真实ID的最佳方法是什么 当然,对于大多数事情,我可以理解这不会有太大的区别,但是我正在开发的应用程序意味着,如果用户“猜测”URL中的ID以提取另一条记录,这可能是一个安全问题 似乎有很多关于方法的想法/评论,但没有什么是非常合拍的 我想有一个自动生成的主

显然,根据返回到web前端的数据的类型/上下文(在我的例子中,设置为HTML/Javascript、.NET Csharp后端和JSON作为数据传输),如果我必须返回一个ID,比如一条消息的ID是自动生成的主键(Int64),那么“隐藏”这个真实ID的最佳方法是什么

当然,对于大多数事情,我可以理解这不会有太大的区别,但是我正在开发的应用程序意味着,如果用户“猜测”URL中的ID以提取另一条记录,这可能是一个安全问题

似乎有很多关于方法的想法/评论,但没有什么是非常合拍的

我想有一个自动生成的主INT,但也有一个备用GUID。它将是返回给任何前端进程的GUID,当然,自动生成的主ID仍将在后端使用

当然,我们的想法是,要猜测/获取另一个GUID以访问记录,GUID会困难得多

人们有什么想法或最佳实践吗

提前感谢,, 大卫

我正在研究的方法是,如果用户“猜测”URL中的某个ID以撤回另一条记录,那么这可能是一个安全问题……”

如果是这种情况,那么您真的需要后退一步,检查安全方法。如果用户可以访问他们没有权限查看的记录,则您没有为您的对象引用提供适当的安全性-


GUID方法将试图通过模糊性来提供安全性,看看它是否提供安全性。您必须根据自己的情况做出决定。

我想说的是,URL是公开的,它不是一种机密数据。没有必要对用户隐藏URL。如果一个用户可以看到一个URLd不应该被其他用户访问,您应该从服务器端检查用户的权限,而不是隐藏该url。

当然,从技术上讲,通过查询另一个ID来撤回另一条记录是一件坏事-只有当撤回记录的用户不应该看到该另一个ID时。但是,您有一个安全问题nyways,你应该专注于此,而不是找到一种混淆ID的方法

不管怎样,如果你想弄乱url,我建议你看看Rijndael。我们这里经常使用它来传递令牌。基本上,这种加密技术允许你加密和解密。因此你可以加密ID,发送给客户端,客户端发回,你只需再次解密。不需要额外的数据库更安全的方法是加密/解密记录ID,并为当前客户端添加类似IP的内容,因此即使是URL钓鱼也会减少问题

请参阅:

所有其他答案(3)未能涵盖这是一个未烹饪、未认证、未会话、未登录的用户的可能性

例如,订单后的确认页等

在这种情况下,您的身份验证基于URL中的一个秘密。您使用的秘密在所有实际用途中都是不可用的,并且每个记录都是唯一的。然后您假设如果用户拥有该秘密,那么他们就可以访问该记录,等等

真正的挑战是找到一种制作秘密UUID的好方法。许多开发人员会使用rand()+time()+UUID()+remote_ip()的SHA1()或类似的东西(这通常已经足够了),但我相信有很多关于这方面的文档

是的,在您让未经身份验证的用户访问特定数据段或执行操作(如密码重置)的情况下,您需要在记录上使用唯一密钥(如您所述)设置第二个标识符(如varchar 40)。使用非常随机的数据填充该标识符,如果他们拥有该机密,则让他们进入


小心。

关于安全性,您有几个方面:

  • 会话劫持
  • 访问/修改/创建/删除用户无权访问的记录
  • 非认证访问
  • 跨站点*攻击
  • 中间人攻击
  • 等等
处理这些问题的措施取决于您的体系结构和安全需求

因为你对你的架构和安全需求没有太多的描述,所以很难给出任何具体的建议

关于“ID不应该是可猜测的”的一些观点:

  • “正确”的解决方案
    当您正确地实现身份验证+身份验证时,问题就消失了 因为正确实现了这两个功能,所以必须确保只有经过身份验证的用户才能访问 任何东西,并且每个用户只能访问他被允许访问的东西。即使经过身份验证的用户知道他不被允许访问的东西的正确ID,这将是安全的,因为他将被阻止访问它。

  • “弱解”
    创建一个
    ConcurrentDictionary
    作为线程安全的内存缓存,并将真实ID加上“临时ID”(例如,在首次访问新生成的GUID记录时)放在其中。您可以将该临时ID与一些特定于连接的方面(如客户端IP、时间等)的salt和/或加密和/或散列结合起来。然后在每次访问时,您都会使用ConcurrentDictionary进行检查并相应地采取行动……一个积极的效果是:在应用程序重新启动(例如应用程序池回收)后,同一条记录会获得一个不同的ID,因为这只是一个内存缓存……尽管这在web场景中很难使用


我猜这个问题与之类似,但我还是想听听其他选项?您可以在传递之前对其进行加密…GUID也非常安全…加密的GUID可能是最安全(极端但安全)的混淆方式,意思是“呈现模糊、不清楚或不可理解”。OP不是在谈论模糊