【问题标题】:User Access Checking for Rights on Particular Database Objects or Records用户访问检查特定数据库对象或记录的权限
【发布时间】:2008-10-31 19:17:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: security asp-classic authorization


    【解决方案1】:

    我建议存储过程 加载文档的 UserId 作为参数进行验证 文档的权利。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        用户ID 应该是一个会话变量。正确的。在查询字符串中传递 documentID。是的。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-11
          • 1970-01-01
          • 2015-01-11
          • 1970-01-01
          相关资源
          最近更新 更多