T-SQL问题解决集锦——数据加解密(2)

时间:2022-05-24 12:15:23

原文:T-SQL问题解决集锦——数据加解密(2)

问题三、如何让指定用户可以对数据表进行Truncate操作?

Truncate在对大表全删除操作时,会明显比Delete语句更快更有效,但是因为它不需要存放日志,并且一定是全表删除,所以造成数据的不可恢复性。也说明了它的危险性。

但是,执行Truncate需要有表拥有者、系统管理员、db_owner、db_ddladmin这些里面的其中一种高权限角色才能执行。

对此,可以使用05之后的EXECUTE AS表达式来实现权限内容的切换:

1.      切换登录:EXECUTE AS LOGIN

2.      切换用户:EXECUTE AS USER

3.      切换执行权限:EXECUTE AS owner/’user name’,利用高用户权限来执行作业。此步骤可以在低权限实体下执行高权限操作,也能避免安全性漏洞。

另外,只有EXECUTE AS Caller可以跨数据库执行,而其他方式进行的权限切换仅限制于本数据库。

注意:执行EXECUTE AS USER模拟使用者切换时,需要先获得被模拟用户的授权。

可以使用REVERT来还原执行内容前的原始身份。

问题四、如何获取前端连接的信息,如IP地址和计算机名?

对于DBA工作或者某些特殊的应用程序,需要获取前端应用的系统信息。而这些信息如果用用户表来存储,代价会比直接读取数据库系统信息要大。所以建议适当读取系统表:

在连接数据库的session期间,都可以在master数据库中找到session信息,但是从05开始,有了很多DMV/DMF来实现这些功能:

l  Master.dbo.sysprocesses或者master.sys.sysprocesses:提供执行阶段的SPID、计算机名、应用程序名等。

l  Sys.dm_exec_sessions:记录每个session的基本信息,包括id、计算机名、程序名、应用程序名等

l  Sys.dm_exec_connections:记录每个连接到SQLServer实例的前端信息,包括网络位置、连接时间等等。

l  select
client_net_address 'Client IP Address',local_net_address'SQL ServerIP Address',*

l  from
sys.dm_exec_connections

l  wheresession_id=@@spid

在2005以后,建议使用DMV取代系统表。

问题五、如何避免SQL注入的攻击?

对于数据库应用程序,无论是那种DBMS,SQL注入都是一大隐患。

要避免SQL注入,应该最起码做到以下几点:

1.      检查输入的数据,应用程序不要相信用户输入的数据,必须经过检验后才能输入数据库。要排除%、--等特殊符号。

2.      避免果度暴露错误信息。建议可以转换成Windows事件或者是转换成应用程序内部错误信息。

3.      使用参数化查询或者存储过程

注意:

动态SQL是造成SQL注入的主凶