将数据库ID公开给UI

nik*_*kov 6 c# sql design-patterns asp.net-mvc-3

这是一个关于Web表单数据类型的初学者模式问题.我读过公开数据库ID - 安全风险?接受的答案让我觉得这是浪费时间,但等等......

我有一个引用业务逻辑库的MVC项目,以及引用它的NHibernate SQL存储库的程序集.如果有什么东西强迫我的手去直接从我的控制器代码库引用这些存储库,我就知道出了什么问题.但是,当这些控制器在URL参数中与数据库记录ID对话时,它只是看起来错了吗?

我无法想象那些ID会变成不可消耗的(通过MVC动作).我认为我不需要两个对应于数据库中同一行的UI实体.我不打算让控制器以任何方式解释ID.代理键会产生零差异.尽管如此,我还是想解决这个问题,因为关于平面设计的假设并不比跳过层次的依赖更好.

如何使用仅引用业务逻辑程序集的Web应用程序以及仅对该会话具有意义的GUID进行会话,而程序集使用数据库ID保留事务?

Bri*_*ite 3

如果需要,您可以对您的 ID 进行加密或散列。使用会话 ID 作为盐。这取决于上下文。您希望公共购物网站的目录页面清晰且易于复制。用户帐户管理员可以对 ID 进行加密,这样用户就无法通过 url 入侵他人的帐户。

我不认为这是默默无闻的安全。如果恶意用户有一个被盗用的帐户,他们可以查看以该用户身份登录时设置的所有表单字段、URL ID 和 Cookie 值。然后,他们可以尝试在以其他用户身份登录时使用这些权限来升级权限。但是,通过使用会话 ID 作为盐来保护它们,您已经锁定了该数据,因此它仅在一个会话中有用。这些页面甚至无法添加书签。他们能弄清楚你的保护吗?可能吧。但他们很可能会转移到另一个网站。如果有人想上车,锁上车门实际上并不能阻止他们进入你的车,但它会让事情变得更困难,所以每个人都会这么做。