SQL Server的Execute As与连接池结合使用的测试

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
简介

    在SQL Server中,Execute As关键字允许当前账户在特定上下文中以另一个用户或登录名的身份执行SQL语句,比如用户张三有权限访问订单表,用户李四并没有权限访问订单表,那么给予用户李四访问订单的表的权限就有些过头了,因为李四可能只有在很特定的上下文环境中才需要访问订单表,因此可以在特定上下文中使用Execute As Login 张三,暂时以张三的身份访问订单表,从而保证更安全的权限控制。

    另一方面,应用程序通过网络与数据库连接是需要在传输层通过TCP协议,而TCP协议在建立连接的阶段的成本会比较高(1.同步请求 2同步请求+Ack 3.确认 这三个阶段),因此减少TCP连接可以很大程度上提升性能。因此当应用程序与数据库建立连接后,在一定空闲时间内不在TCP协议上切断连接,而是保持连接,连接的断开操作仅仅是逻辑上断开,当新的请求由应用程序发送到客户端时,复用之前建立在应用程序与数据库上的连接,从而极大的提升了连接性能。

    当在连接池上使用Execute As切换连接的安全上下文时则可能产生的情况我们通过下述几种实验来得出结论。

 

在使用连接池的情况下使用Execute As切换安全上下文

    试验中所用的连接字符串全部为:

   1: data source=.;database=test;uid=GetMembers;pwd=sa;pooling=true;Connection Timeout=30
   2:  
   3:  
实验一:使用动态SQL,切换安全上下文

    该实验分别使用两个连接,第一次连接中,用户为GetMembers,将安全上下文切换为系统最大权限登录名SA,连接断开时保持SA安全上下文,应用程序端发送的SQL代码如代码1:

   1: EXECUTE AS LOGIN = 'sa';SELECT * FROM dbo.Higher;"
   代码1.第一次连接数据库执行的语句

 

    在将身份切换为SA后,正常查询GetMembers没有的dbo.Higher表的权限,执行完代码1所示的SQL后,连接正常关闭。第二次连接使用连接池复用第一次连接所建立的连接,执行的SQL如代码2:

   1: SELECT * FROM Higher
代码2.第二次连接使用的SQL

   

    在Asp.net端看到的查询结果如图1所示。

    image

    图1.两次连接在Asp.net中的信息

 

    由图1可以看出,当复用连接池时,由于第一次连接以GetMembers登录名登录,安全上下文切换到SA并没有切换回来,第二次再次登录时就会报错,报的错对应在SQL Server日志里如图2所示。

   image

    图2.SQL Server端报错

 

    结论:由此看出,当连接池复用时,第一次连接切换了上下文第二次连接复用时就会直接报错,这也是期待的结果,从而保证了安全性,如果希望采用这种方式结合连接池,则必须在第一次连接完使用Revert将安全上下文转换回登录时的安全上下文。

 

实验二:在存储过程中使用Execute As转换安全上下文

    还是两次连续的连接,第一次在存储过程中执行Execute As转换上下文为SA,代码如代码3所示:

   1: CREATE PROCEDURE [dbo].[GetMembers]
   2:  
   3: AS
   4:  
   5: EXECUTE AS USER = 'sa'
代码3.在存储过程中执行Execute As

 

    第二次连接进来的查询执行一个非常简单的Select语句,但没有对应权限,执行结果如图3所示:

image

图3.第二次连接不会受第一次在存储过程中改变上下文的影响

 

    在数据库端对应的跟踪如图4所示。

    image

    图4.对应的跟踪

 

    因此可以看出,在存储过程中改变安全上下文对连接池无影响,安全上下文仅仅在存储过程中有效。

 

实验三:连接池对隔离级别的影响

    在实验3中对连接的默认隔离级别更改,更改为可序列化级别,SQL语句如代码4所示。

   1: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
代码4.改变连接的隔离级别

 

    随后的连接查询并返回当前连接的隔离级别,结果如图5所示。

    image

    图5.改变隔离级别导致复用连接池中的连接隔离级别改变

 

    结论:使用连接池对修改Session级别的隔离级别用完必须改回默认连接,否则可能导致后续连接在不正确的隔离级别下运行。

 

实验四:在存储过程中改变隔离级别的连接复用的影响

    下面我们在存储过程中改变隔离级别,代码如代码5所示:

   1: create PROCEDURE [dbo].[TestIslation]
   2: AS
   3:  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   4:  
   5:  SELECT CASE transaction_isolation_level 
   6: WHEN 0 THEN 'Unspecified' 
   7: WHEN 1 THEN 'ReadUncommitted' 
   8: WHEN 2 THEN 'ReadCommitted' 
   9: WHEN 3 THEN 'Repeatable' 
  10: WHEN 4 THEN 'Serializable' 
  11: WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
  12: FROM sys.dm_exec_sessions 
  13: where session_id = @@SPID
代码5.在存储过程中更改隔离级别,并显示当前的隔离级别

 

    在随后的连接中,在非存储过程中调用显示当前Session隔离级别的语句,并打印,结果如图6所示。

image

    图6.

 

    由图6可以看出,第三次连接在存储过程内改变隔离级别,第四次连接的隔离级别并不受影响。

 

   结论:在存储过程内改变隔离级别不会影响后续连接池的使用。

 

 

小结

    本文对在使用连接池情况下数据库中的一些细节场景进行了实验,可以看到对于连接池复用来说,改变隔离级别可能会存在隐性的风险,其他情况SQL Server都能够显式处理。因此使用连接池对修改Session级别的隔离级别用完必须改回默认连接,或者在语句级别修改隔离等级而不是Session级别。



本文转自CareySon博客园博客,原文链接http://www.cnblogs.com/CareySon/p/4146998.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6月前
|
SQL 存储 数据库
Python 的安全性和测试:什么是 SQL 注入攻击?如何防范 SQL 注入?
Python 的安全性和测试:什么是 SQL 注入攻击?如何防范 SQL 注入?
98 1
|
6月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
582 8
|
1月前
|
SQL 关系型数据库 MySQL
SQL批量插入测试数据的几种方法?
SQL批量插入测试数据的几种方法?
95 1
|
1月前
|
SQL 安全 测试技术
墨者学院sql手工测试记录
墨者学院sql手工测试记录
|
6月前
|
SQL Java 关系型数据库
实时计算 Flink版操作报错之如何处理从源表插入数据到结果表报错误:[ERROR] Could not execute SQL statement.
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
|
4月前
|
SQL 安全 关系型数据库
使用SQLMap进行SQL注入测试
使用SQLMap进行SQL注入测试
|
5月前
|
存储 前端开发 JavaScript
VSCode调试揭秘:Live Server助力完美测试Cookie与Session,远超“Open in Browser“!
VSCode调试揭秘:Live Server助力完美测试Cookie与Session,远超“Open in Browser“!
|
6月前
|
Oracle 关系型数据库 数据库
实时计算 Flink版操作报错合集之执行Flink job,报错“Could not execute SQL statement. Reason:org.apache.flink.table.api.ValidationException: One or more required options are missing”,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
351 0
|
6月前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
708 0
下一篇
无影云桌面