2008-10-31 59 views
0

我与开发人员就用户登录并访问Web应用程序中的文档的情况进行了友好辩论。当我们加载文档供用户查看时,我们有会话中的用户ID和可以通过QueryString传递的documentID。用户访问权限检查特定数据库对象或记录的权限

为了防止用户修改QueryString上的documentID,我建议加载文档的存储过程将UserId作为参数来验证文档的权限。

我的开发人员朋友建议我们运行一个单独的过程来确定页面前面的文档的访问权限,并且只需运行一个过程以在显示文档时抓取文档。

我们错过了什么吗?哪个最有效和最安全?我认为将带有DocID的UserId传递给一个过程调用来检查权限,并将文档拉到一个更有效的解决方案。

回答

1

严格地说,从性能的角度来看,将UserID和DocumentID一起传递到一个存储过程将是最好的。您只需往返数据库服务器一次。另外,正如其他人指出的那样,如果您将从其他页面或应用程序中检索此文档,并且您使用相同的存储过程,则可确保您不会绕过安全性。

但是,有些情况下专用安全验证存储过程是有意义的。如果除了文档之外还有其他资源需要保护,并且您的验证代码不是微不足道的,则可能不希望在数据库中的每个存储过程中复制验证代码。在这种情况下,将安全性基础架构移出到数据访问层可能有意义,并且在检索请求的资源之前让数据访问层调用db调用来授予访问权限。如果采取这种方式,您不希望依赖开发人员在请求资源之前始终要记住进行授权数据库调用。

1

userID应该是一个会话变量。对。在查询字符串中传递documentID。对。

假设文档存储在数据库中,我将拥有一个权限表:recordID userID和documentID。调用文档时,您会与此表进行连接。如果你没有得到结果,你不会得到文件。索引一切很好,它会很快。

2

我建议加载该文件采取 用户ID作为参数的存储过程 验证 权限的文件。

我觉得这是要走的路。如果没有其他原因而不是安全。如果你重新使用这个过程,然后忘记检查访问 - 你已经打开了一个大洞。这种方式很明显,因为除非有权访问,否则无法访问文档。