从数据库获取对象的详细信息 - 保持ID安全

时间:2009-12-01 00:46:08

标签: asp.net sql-server security session

我有从数据库中获取的书籍清单。当用户选择一本书时,我希望它能够检索该书的信息并将其显示在屏幕上。但是,我想在客户端隐藏书籍的ID,那么转移所选书籍ID的最佳方法是什么?我想我的大脑已经融化了,所以我可能会遗漏一些明显的东西。会话似乎是没有传输任何ID信息的唯一方法,但我不确定如何实现选择项目的系统(从最适合的控件类型),并以某种方式拾取项目的ID由服务器和检索到的相关信息。 (使用ASP.NET + SQL Server)。 感谢您的任何建议

4 个答案:

答案 0 :(得分:4)

您是否真的想要隐藏用户的数据库ID,例如在用户具有对数据库的一些备用访问权限并且您希望他难以搜索该书的情况下?

通常要求不是保密ID,而是防止用户弄清楚其他物品的ID(例如,强制执行某个导航渠道以到达物品)或者与其他用户共享ID。因此,例如可以使用URL http://example.com/books/0867316672289,其中0867316672289将相同的书呈现给同一个访问者,但是用户无法查看该值,因此0867316672288或0867316672290将登陆404s 。可能还需要输入0867316672289的另一个用户获得404.

保持ID真正“秘密”(即将其存储在会话中并使会话状态跟踪“当前书籍”)对上述方案几乎没有什么价值,只会使事情复杂化。

一种解决方案是使用站点密钥加密ID。从int ID中获得16字节加密块(例如,如果使用AES块大小),可以在后续访问时将站点恢复为原始ID。由于解决方案空间的大小(16字节),访问者无法猜测其他ID。如果您还想让伪id对用户产生粘性,您可以使加密密钥特定于用户(例如,从用户ID派生)或将额外信息添加到伪id中(例如,加密用户ID和检查)它在你的请求处理程序中。)

答案 1 :(得分:1)

答案 2 :(得分:0)

如何为每本书使用“伪id”?我假设你需要客户端的东西告诉服务器客户选择哪本书。

为每本书生成一个Guid,用作网络侧“伪id”,这样可以保证真正的id相当安全。

答案 3 :(得分:-2)

我不确定我理解你的问题,因为答案似乎太明显了:只是不要将实体的ID发送给客户。在服务器端使用它来组成ASP.NET页面,但不要在发送到客户端的输出页面上包含id本身。

这有意义吗? : - )