这是一个关于Web表单数据类型的初学者模式问题.我读了
Exposing database IDs – security risk?,接受的答案让我觉得这是浪费时间,但等等……
我有一个引用业务逻辑库的MVC项目,以及引用它的NHibernate sql存储库的程序集.如果有什么东西强迫我的手去直接从我的控制器代码库引用这些存储库,我就知道出了什么问题.但是,当这些控制器在URL参数中与数据库记录ID对话时,它只是看起来错了吗?
我无法想象那些ID会变成不可消耗的(通过MVC动作).我认为我不需要两个对应于数据库中同一行的UI实体.我不打算让控制器以任何方式解释ID.代理键会产生零差异.尽管如此,我还是想解决这个问题,因为关于平面设计的假设并不比跳过层次的依赖更好.
如何使用仅引用业务逻辑程序集的Web应用程序以及仅对该会话具有意义的GUID进行会话,而程序集使用数据库ID保留事务?
解决方法
如果需要,您可以加密或散列您的ID.使用会话ID作为salt.这取决于具体情况.一个公共购物网站,您希望目录页面清晰易于复制.用户帐户admin可以加密ID,因此用户无法将其黑客入侵其他人的帐户.
我不认为这是默默无闻的安全.如果恶意用户拥有一个受感染的帐户,他们可以查看以该用户身份登录时设置的所有表单字段,url ID和Cookie值.然后,他们可以尝试使用那些以其他用户身份登录的用户来升级权限.但是通过使用会话ID作为salt保护它们,您已将数据锁定,因此它仅在一个会话中有用.这些页面甚至无法加入书签.他们可以找出你的保护吗?有可能.但可能他们只是转移到另一个网站.如果他们想要进入,锁定你的车门实际上并没有让任何人离开你的车,但它会使它更难,所以每个人都这样做.