如何从HTML/Javascript隐藏数据库ID
本文关键字:隐藏 数据库 ID Javascript HTML | 更新日期: 2023-09-27 18:06:25
显然取决于返回到web前端的数据的类型/上下文(在我的情况下设置是HTML/Javascript, .NET Csharp后端和JSON作为数据传输),如果我必须返回一个ID说的消息是一个自动生成的主键(Int64),什么是最好的方法来"隐藏"这个真实的ID?
当然,对于大多数事情,我可以理解它没有太大的区别,但是我正在开发的一个应用程序意味着,如果用户"猜测"URL中的ID以拉回另一个记录,它可能被证明是一个安全问题。
似乎有很多关于方法的想法/评论,但没有一个是非常合适的。
我想有一个自动生成的主INT,但也有一个辅助的GUID。它将是返回给任何前端进程的GUID,当然,自动生成的主ID仍将在后端使用。
的想法当然是GUID会更难以猜测/获得另一个访问记录?
人们使用的任何想法或最佳实践?
提前感谢,大卫。
关于安全你有几个方面:
- 会话劫持
- 访问/修改/创建/删除用户未授权的记录 匿名访问
- 跨站攻击* <
- 中间人攻击/gh>
- 等。
处理这些问题的措施取决于您的体系结构和安全性需求。
既然你没有说太多关于你的架构和安全需求,真的很难给出任何具体的建议…
关于"ID不应该被猜测"的几点:
-
"正确"的解决方案
只要您正确地实现了身份验证+授权,这个问题就会消失因为正确实现这两个功能可以确保只有经过身份验证的用户才能访问并且每个用户只能访问他被允许访问的东西。即使经过身份验证的用户知道他不允许访问的内容的正确ID,这也是安全的,因为他将被阻止访问它。
"弱解"创建一个ConcurrentDictionary
作为线程安全的内存缓存,并将真实id加上"临时id"(例如在第一次记录访问新生成的guid时)放在那里。您可以将临时ID与某些特定于连接的方面(如客户端IP、时间等)的盐和/或加密和/或散列结合起来。然后在每次访问时检查ConcurrentDictionary并采取相应的行动…一个积极的影响:应用程序重启后(例如应用程序池回收),相同的记录得到一个不同的ID,因为这只是一个内存缓存…尽管这在web农场场景中很难使用
我正在研究的方法是,如果用户"猜测"URL中的ID以拉回另一条记录,则可能被证明是一个安全问题。"
如果是这种情况,那么您真的需要退后一步并检查安全性方法。如果用户可以访问他们没有权限查看的记录,你没有为你的对象引用提供适当的安全- https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References
GUID方法将尝试通过隐晦提供安全性,请参阅使用GUID是通过隐晦提供安全性吗?至于是否会,你必须根据自己的情况做出自己的决定。
当然,从技术上讲,通过猜测另一个ID来回拉另一条记录是一件坏事——只有当另一个ID对于正在回拉它的用户不应该是可见的时候。但这样就有了安全问题你应该关注这个而不是想办法混淆ID
无论如何,如果你想弄乱url,我建议你看看Rijndael。我们这里经常用它来传递代币。基本上,这种加密技术允许加密和解密。因此,您可以加密ID,将其发送给客户端,客户端将其发回,然后您可以简单地再次解密。不需要额外的数据库记录。更安全的是加密/解密带有当前客户端IP之类内容的记录ID,因此即使URL钓鱼也会减少问题。
参见:http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx
我想说的是,URL是公开的,它不是一种机密数据。没有必要对用户隐藏url。如果一个url可以被一个用户看到,而不应该被其他用户访问,您应该从服务器端检查用户的权限,而不是隐藏该url。
所有其他答案(3)都未能涵盖这是一个非烹饪,非身份验证,非会话,未登录的用户的可能性。
例如,订单后的确认页等…
在这种情况下,您的身份验证基于URL中的秘密。您使用的秘密在所有实际用途中都是不可猜测的,并且每个记录都是非常独特的。然后假设如果用户有这个秘密,那么他们就可以访问该记录,等等…
真正的挑战是找到一种制作秘密UUID的好方法。许多开发人员将采用rand() + time() + uuid() + remote_ip()的SHA1()或类似的东西(这通常是足够的),但我相信有很多关于这方面的文档。
是的,在您有一个未经身份验证的用户访问特定的数据块或执行操作(如密码重置)的情况下,您需要在您的记录上具有唯一键的第二个标识符(例如,varchar 40)(如您所概述的)。用非常随机的数据填满它,如果他们有这个秘密,那就让他们进来。
照顾。