我与开发人员就用户登录和访问Web应用程序中的文档的情况进行了友好的辩论。当我们加载文档供用户查看时,我们在会话中有userID,可以通过QueryString传递documentID。
为了防止用户修改QueryString上的documentID,我建议加载文档的存储过程将UserId作为参数来验证文档的权限。
我的开发人员朋友建议我们运行一个单独的过程来确定页面前面对文档的访问权限,然后运行一个过程来在显示文档时抓取文档。
我们错过了什么吗?哪个最有效,最安全?我认为将带有DocID的UserId传递给一个程序调用以检查权限并拉出文档是一种更有效的解决方案。
答案 0 :(得分:2)
我建议存储过程 加载文件拿 UserId作为验证参数 文件的权利。
我认为这是要走的路。如果没有其他原因比它更安全。如果你重复使用这个过程,然后忘记检查访问 - 你已经打开了一个大洞。这种方式显而易见,除非您有权访问,否则无法访问该文档。
答案 1 :(得分:1)
userID应该是会话变量。对。在查询字符串中传递documentID。烨。
假设文档存储在数据库中,我将拥有一个权限表:recordID,userID和documentID。在调用文档时,您可以使用此表进行连接。如果您没有得到结果,则不会获得该文档。将它全部索引并且速度很快。
答案 2 :(得分:1)
严格地说,从性能角度来看,将UserID和DocumentID一起传递到一个存储过程中是最好的。您只有一次往返数据库服务器。此外,正如其他人所指出的那样,如果您要从其他页面或应用程序中检索此文档,如果您使用相同的存储过程,则可以确保您没有绕过安全性来执行此操作。
但是,有些情况下,使用专用的安全验证存储过程是有意义的。如果除了文档之外还有其他要保护的资源,并且验证代码不是很简单,则可能不希望在数据库中的每个存储过程中复制验证代码。在这种情况下,将安全基础结构移出到数据访问层可能是有意义的,并且在检索所请求的资源之前让数据访问层进行db调用以授权访问。如果采用此路由,则不希望依赖开发人员始终必须记住在请求资源之前进行授权db调用。