首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 禁止用戶創建表:數據庫權限最小化實戰

     編輯:關於SqlServer

發現網站數據庫被惡意創建 D99_CMD、D99_Tmp 等可疑表,除代碼層面修復注入漏洞外,**數據庫層面收回公共用戶的 CREATE TABLE 權限**是快速止血的關鍵。本文演示 SQL Server 2000 企業管理器與 T-SQL 兩種方式禁止指定用戶建表。

現象與風險

  • Web 應用連接賬戶(如 web_user)擁有 db_ddladmin 或 db_owner 角色,可任意建表/改結構。
  • 攻擊者利用 SQL 注入執行 CREATE TABLE ...,植入惡意結構、竊取數據、甚至提權。
  • 最小權限原則:Web 賬戶僅需 SELECT/INSERT/UPDATE/DELETE/EXEC(執行存儲過程),**嚴禁 DDL 權限**。

方法一:企業管理器圖形化操作(SQL 2000 風格)

  1. 企業管理器 → 展開服務器 → 「數據庫」→ 右鍵目標庫(如 jb51net)→ 「屬性」。
  2. 切換「權限」標籤。
  3. 在用戶/角色列表中選中 Web 連接賬戶(如 web_user 或 public 角色)。
  4. 在權限矩陣中,**取消勾選「創建表」**、「創建視圖」**、「創建存儲過程」**、「創建默認」**、「創建規則」**、「備份數據庫」**、「備份日志」** 等所有 DDL/管理權限。
  5. 保留:選取、插入、更新、刪除、執行** 權限(針對具體表/存儲過程)。
  6. 點擊「確定」生效。

方法二:T-SQL 腳本化(可納入部署流程)

-- 1. 創建專用數據庫角色(若不存在)
IF NOT EXISTS (SELECT * FROM sysusers WHERE name = 'web_app_role' AND issqlrole = 1)
    EXEC sp_addrole 'web_app_role';
GO

-- 2. 授予最小 DML 權限(按表粒度更安全,此處示例庫級)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON DATABASE::jb51net TO web_app_role;
-- 或針對具體表:
-- GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.Orders TO web_app_role;

-- 3. 明確拒絕 DDL 權限(拒絕優先於授予)
DENY CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE FUNCTION, 
     ALTER ANY SCHEMA, BACKUP DATABASE, BACKUP LOG TO web_app_role;
GO

-- 4. 將 Web 連接用戶加入角色
EXEC sp_addrolemember 'web_app_role', 'web_user';
GO

-- 5. 移除用戶原有的高權限角色(如 db_ddladmin, db_owner)
EXEC sp_droprolemember 'db_ddladmin', 'web_user';
EXEC sp_droprolemember 'db_owner', 'web_user';
GO

驗證測試

-- 使用 Web 賬戶上下文測試
EXECUTE AS USER = 'web_user';
GO
CREATE TABLE dxytmp (name VARCHAR(255), id INT);  -- 預期失敗
GO
REVERT;
GO

預期報錯:「許可權被拒絕,無法在數據庫 'jb51net' 中創建表 'dxytmp'。」 即配置生效。

配套加固清單

  • [ ] 修復所有 SQL 注入點(參數化查詢、存儲過程、ORM)。
  • [ ] 數據庫賬戶密碼複雜度、定期輪換、最小權限原則。
  • [ ] 禁用 sa、重命名 sa、限制 sa 登錄 IP。
  • [ ] 開啟登錄審計(失敗/成功),異常 DDL 告警。
  • [ ] 文件系統層面:網站目錄寫入權限最小化,禁用腳本執行權限。
  • [ ] WAF/防火牆層面:攔截含 CREATE/ALTER/DROP 的異常請求。

權限收口是資料庫安全的最後一道防線,**「只給幹活的權限,不給搞破壞的權限」**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved