sql - 避免使用 SET TRUSTWORTHY ON

标签 sql security sql-server-2008 cross-database

我正在使用一个系统,该系统必须根据在另一个数据库中创建的对象在一个数据库中创建对象。对象不是重复的,所以我不能简单地复制对象。

我有下面的代码,它提供了我正在尝试做的事情的简化演示。如果您取消注释 ALTER DATABASE语句然后它将运行而没有任何错误。不过,这有可能造成安全漏洞,所以我想尽可能避免它。

我试过使用证书和模拟,但似乎没有任何效果。我认为 DDL 触发器在涉及用户与登录时忽略了很多安全性。我还尝试在 Test_DB_2 中创建一个存储过程,它调用 Test_DB_1 中的 SP 并让触发器调用该存储过程,但这也无济于事。

所以,如果你愿意接受它,你的挑战是让下面的代码在不设置 TRUSTWORTHY ON 的情况下工作(或打开数据库链接,如果这有任何影响)。

感谢您提供的任何帮助!

/************************
   SET-UP THE TEST
************************/
USE master
GO
CREATE LOGIN Test_Security_Login WITH PASSWORD = 'p@ssw0rd1!'
CREATE DATABASE Test_DB_1
CREATE DATABASE Test_DB_2
GO
USE Test_DB_1
GO
CREATE PROCEDURE dbo.Create_View
AS
BEGIN
 EXEC('CREATE VIEW Test_View AS SELECT 1 AS one')
END
GO
CREATE USER Test_Security_User FOR LOGIN Test_Security_Login
GRANT EXECUTE ON dbo.Create_View TO Test_Security_User
GO
USE Test_DB_2
GO
CREATE TRIGGER DDL_TRIGGER ON DATABASE WITH EXECUTE AS 'dbo' FOR DDL_VIEW_EVENTS
AS
BEGIN
 EXEC Test_DB_1.dbo.Create_View
END
GO
CREATE USER Test_Security_User FOR LOGIN Test_Security_Login
EXEC sp_addrolemember 'db_ddladmin', 'Test_Security_User'

/************************
   RUN THE TEST
************************/
USE Test_DB_2
GO
--ALTER DATABASE Test_DB_1 SET TRUSTWORTHY ON
--ALTER DATABASE Test_DB_2 SET TRUSTWORTHY ON
EXECUTE AS USER = 'Test_Security_User'
GO
CREATE VIEW dbo.Test_View_2 AS SELECT 2 AS two
GO
REVERT
GO

/************************
   CLEAN-UP
************************/
USE master
GO
DROP DATABASE Test_DB_1
DROP DATABASE Test_DB_2
DROP LOGIN Test_Security_Login
GO

最佳答案

太容易了。使用代码签名:

  • 在 db1 中创建自签名证书
  • 用证书签署触发器
  • 删除私钥以防止滥用
  • 将证书导出到 db2(从文件备份/创建)
  • 从 db2 中的证书创建凭证
  • 授予 AUTHENTICATE 和任何其他必要的权限以授予证书派生凭证
  • ?
  • 利润

  • 这是防弹的。见 Call a procedure in another database from an activated procedure一个完全成熟的例子。

    关于sql - 避免使用 SET TRUSTWORTHY ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3494996/

    相关文章:

    asp.net - 什么是基本的 ASP.NET 表单安全实践?

    security - 为什么 Tomcat 管理器使用我的 LoginModule?

    sql - 如何使用插入选择语句插入下一个最大值

    sql-server-2008 - 如何将值添加为单独列中的累积值?

    mysql - 在日期范围和特定时间范围之间选择

    java - 生成格式错误的查询

    javascript - electron js如何对源码进行混淆和保护源码

    sql - 如何根据行索引更新表?

    php - 当 SQL 查询中包含括号时,为什么 CodeIgniter 不会返回结果?

    php - 使用 SQL 和 PHP 从不同表中搜索数据