0

我正在与开发人员就用户登录并访问 Web 应用程序中的文档的情况进行友好的辩论。当我们加载文档供用户查看时,我们有会话中的 userID 和可能通过 QueryString 传递的 documentID。

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

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

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

4

3 回答 3

2

我建议加载文档的存储过程将 UserId 作为参数来验证对文档的权限。

我认为这是要走的路。如果没有其他原因,那就更安全了。如果您重复使用此过程,然后忘记检查访问权限 - 您已经打开了一个大洞。这样一来,除非您有权访问,否则您无法访问文档。

于 2008-10-31T19:31:32.920 回答
1

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

假设文档存储在数据库中,我将有一个权限表:一个记录 ID、一个用户 ID 和一个文档 ID。调用文档时,您可以与此表进行连接。如果你没有得到结果,你就没有得到文件。很好地索引它,它会很快。

于 2008-10-31T19:30:24.403 回答
1

严格从性能的角度来看,将 UserID 与 DocumentID 一起传递到一个存储过程中是最好的。您只有一次到数据库服务器的往返行程。此外,正如其他人所指出的,如果您要从其他页面或应用程序中检索此文档,如果您使用相同的存储过程,则可以确保您没有绕过安全性这样做。

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

于 2008-10-31T19:47:32.030 回答