代码之家  ›  专栏  ›  技术社区  ›  Tom H

确定当前正在进行的安全检查(SQL Server)

  •  4
  • Tom H  · 技术社区  · 14 年前

    在处理今天的一个问题时,我想,“我希望我能在代码中添加一行代码,显示SQL Server在代码运行时使用的安全上下文。”这样的命令存在吗?例如, SELECT security_context()

    至少到那时我可以弄明白为什么SQLServer认为我不应该访问某些东西。

    谢谢!


    例子

    -- Set up
    CREATE USER Test_User WITHOUT LOGIN
    CREATE TABLE Test_Security_Context (my_id INT)
    INSERT INTO Test_Security_Context VALUES (1)
    DENY SELECT ON Test_Security_Context TO Test_User
    GO
    CREATE PROCEDURE Test_Security_Context_SP
    AS
      SELECT SUSER_SNAME()
      SELECT * FROM Test_Security_Context  -- This will return ok
      EXEC('SELECT SUSER_SNAME(); SELECT * FROM Test_Security_Context')  -- SUSER_SNAME() will match above but select fails
    GO
    GRANT EXECUTE ON Test_Security_Context_SP TO Test_User
    GO
    
    -- Switch to the new user
    SETUSER 'Test_User'
    GO
    
    -- Do the test
    EXEC Test_Security_Context_SP
    GO
    
    -- Clean up
    SETUSER
    DROP PROCEDURE Test_Security_Context_SP
    DROP TABLE Test_Security_Context
    DROP USER Test_User
    GO
    
    3 回复  |  直到 10 年前
        1
  •  4
  •   Remus Rusanu    14 年前

    是的,考虑到执行方式或代码签名等所有细节,有这样一对视图表示您当前的安全上下文:

    • 所有权链接与安全上下文无关:您不在SP所有者的“上下文”下。所有权链接简单地说,对于与当前对象(SP,View)属于同一所有者的对象,将跳过访问检查。
    • sp_executesql 以任何方式更改安全上下文
        2
  •  2
  •   Andomar    14 年前

    不确定这是否是您所说的安全上下文的意思,但您可以检索与会话相关联的用户,如:

    select SYSTEM_USER
    

    这适用于SQL Server登录或WIndows登录。它甚至可以在存储过程中使用 execute as owner . 例如,

    create procedure dbo.Test
    with execute as owner
    as
    select SYSTEM_USER
    go
    exec dbo.Test
    select SYSTEM_USER
    

    sa
    MyMachine\MyName
    

    如果您正在查找SQL Server用于代表您执行操作的Windows帐户,则可以尝试运行 whoami 通过如下命令:

    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    EXEC sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    
    EXEC master..xp_cmdshell 'whoami'
    

    对我来说,这是回报 nt authority\network service

        3
  •  1
  •   bobs    14 年前

    CURRENT_USER 查看当前安全上下文。举个例子:

    SELECT CURRENT_USER AS 'Current User Name';
    GO
    EXECUTE AS LOGIN = 'junk'
    GO
    SELECT CURRENT_USER AS 'Current User Name';
    GO
    REVERT
    SELECT CURRENT_USER AS 'Current User Name';
    GO
    

    带输出(注意:我是SQL Server的管理员)

    Current User Name
    ------------------
    dbo
    
    (1 row(s) affected)
    
    Current User Name
    ------------------
    Junk
    
    (1 row(s) affected)
    
    Current User Name
    ------------------
    dbo
    
    (1 row(s) affected)
    
    推荐文章