参数嗅探 - 为何产生

这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2部分我们介绍下如何解决这个问题。

什么是参数嗅探(Parameter Sniffing)

在SQL Server里当你执行参数话的SQL查询时,查询优化器会基于第一个提供的参数值编译执行计划。然后生成的执行计划在计划缓存里缓存作为后期的重用。这就是说SQL Server后续会直接重用这个计划,而不管每次你提供的不同参数值。我们需要识别2类参数值:

  • 参数编译值(Compile time values)
  • 参数运行值(Runtime values)

参数编译值是用于查询优化器生成物理执行计划的值。参数运行值是提供给执行计划运行的值。对于第一次执行这些值是一致的,但接下来的执行,这些值就很可能不同了。这就会带来严重的性能问题,因为执行计划只为编译值而优化的,不是为你接下来提供的不同运行值而优化。

如果你在第一次查询执行的时候提供了一个特定值,然后查询优化器选择了非聚集索引查找和书签查找运算符从你表里来获取所有查询列。这样的执行计划只对特定值有意义,非特定值的话,你的逻辑读数就会很高,SQL Server会选择全表扫描,忽略定义的非聚集索引。SQL Server选择这2个计划的决定点就是所谓的临界点(Tipping Point) 。

如果书签查找的计划被缓存,SQL Server就不会理会输入值,盲目重用缓存的计划。这个情况下SQL Server的保护机制就失效了,只从计划缓存里执行缓存的计划。作为副作用,你的IO成本(逻辑都)就会爆表,查询的性能就会非常糟糕。我们来演示下这个情况,下面的脚本会创建一个简单的表,在表的第2列有不平均的数据分布(就第1条值是1,剩下的1499条值都是2)。

 1 -- Create a test table
 2 CREATE TABLE Table1
 3 (
 4     Column1 INT IDENTITY,
 5     Column2 INT
 6 )
 7 GO
 8 
 9 CREATE NONCLUSTERED INDEX idx_Test ON Table1(Column2)
10 
11 -- Insert 1500 records into Table1
12 INSERT INTO Table1 (Column2) VALUES (1)
13 
14 SELECT TOP 1499 IDENTITY(INT, 1, 1) AS n INTO #Nums
15 FROM
16 master.dbo.syscolumns sc1
17 
18 INSERT INTO Table1 (Column2)
19 SELECT 2 FROM #nums
20 DROP TABLE #nums
21 GO

基于这个不平均的数据分布和临界点,对于同个逻辑查询会有2个不同的执行计划,点击工具栏的

显示包含实际的执行计划:

1 SELECT * FROM dbo.Table1 WHERE Column2=1
2 SELECT * FROM dbo.Table1 WHERE Column2=2

现在当你创建一个存储过程时,查询优化器会根据第一次提供的参数值生成执行计划,然后在接下来的执行中就会盲目重用了

1 -- Create a new stored procedure for data retrieval
2 CREATE PROCEDURE RetrieveData
3 (
4     @Col2Value INT
5 )
6 AS
7     SELECT * FROM Table1
8     WHERE Column2 = @Col2Value
9 GO
1 SET STATISTICS IO ON 
2 EXEC dbo.RetrieveData @Col2Value = 1 -- int
3 EXEC dbo.RetrieveData @Col2Value = 2 -- int

现在当你用1值运行存储过程时,只返回1条记录,查询优化器在执行计划里选择书签查找。查询只产生3个逻辑读。但是当你用2值运行存储过程时,缓存的计划被重用,书签查找反复执行1499次。每条记录上都执行!查询现在产生了1505个逻辑读。这和刚才的执行完全不同。当你看查看2值里执行计划里,SELECT运算符的属性时,在参数列表里你可以看到: 

如你所见它们是不一样的,参数编译值是1,参数运行值是2。这就是说在你面前的执行都是基于参数值1而优化的,但实际上你传给存储过程的参数值是2。这就是SQL Server里的参数嗅探(Parameter Sniffing)问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 基于PCAP的网络入侵检测系统C语言实现源码+详细项目说明+作业报告(课程大作业).zip 本项目将实现一个基本的网络入侵检测系统, 涉及到对TCP/IP网络协议和线程的知识理解. 项目将使用`libpcap`库在特定的接口拦截 (嗅探) 数据包, 之后分析数据包. 项目的目标是检测高吞吐量网络中潜在的恶意流量. ## 项目结构 ```bash src ├── Makefile # 构建../build/idsniff ├── analysis.c # 分析和识别恶意数据包 ├── analysis.h ├── dispatch.c # 将analyse()任务分发给多个线程 ├── dispatch.h ├── main.c # 包含解析命令行参数的代码段, 同时调用sniff()在指定的端口上启动抓包 ├── perf.data # 使用perf工具检测性能得到的报告 ├── sniff.c # 使用pcap_loop()持续捕获数据包 └── sniff.h ``` 当一个在TCP套接字上监听的服务器收到海量TCP SYN数据包时, 即受到SYN泛洪攻击. 对于每个收到的SYN包, 服务器将打开一个TCP连接, 分配一些资源, 用一个SYN-ACK包进行回复, 然后等待发件人的ACK. 然而, 恶意的发件人并没有发送ACK. 服务器在等待ACK数据包的过程中, 攻击者发送更多的SYN数据包, 每当有新的SYN数据包到达, 服务器都会临时打开新的端口并在一段时间内保持连接, 用遍所有端口后, 服务器将无法运行. 由于攻击者发送了许多这样的SYN数据包, 服务器的资源被耗尽, 导致合法的连接请求被放弃. 这是一种拒绝服务攻击(Denial-of-service, DoS)的形式. 在大多数情况下, 攻击者从伪造的IP地址生成SYN数据包. 伪造的IP地址是随机产生的, 与攻击者的真实IP地址不一致, 以隐藏攻击者真是身份. 本项目将统计如下信息: 1. 嗅探到的 SYN 数据包总数 2. IP源地址的数量 对于IP地址, 可以采用链表的方式存储, 但由于需要判断IP地址是否唯一, 故需遍历整个链表, 时间复杂度为`O(n)`, 同时我们只需要知道IP地址是否已经存在, 并不需要记录完整的IP地址, 因此内存上的开销也不占据优势. 因此, 考虑使用**Bitmap**的方式记录某个IP地址是否出现, 降低时间和内存开销. 对于IPv4地址, 较优的方案是创建一个大小为$\frac{2^{32}}{2^{5}} = 2^{27}$的`uint32_t`数组, 记录IP地址是否出现. 更多详情见项目说明!!!
SOC 单项选择题120题 多选60题 判断90题 简答30小题 合计300题 一.单项选择题〔共120小题〕 1.在网页上点击一个是使用哪种方式提交的请求? A.GET B.POST C.HEAD D.RACE 正确答案:A; 2.对于单次SQL注入最可能会用到下列哪组字符? A.双引号 B.单引号 C.# D.— 正确答案:B; 3.仅根据扩展名判断,以下哪个文件不是动态页面? 正确答案:D; 4.关于XSS的说法以下哪项是正确的? A.XSS全称为Cascading Style Sheet B.通过XSS无法修改显示的页面内容 C.通过XSS有可能取得被攻击客户端的Cookie D.XSS是一种利用客户端漏洞实施的攻击 正确答案:C; 5.在应用程序中接收到如下内容,请选出对其可信任程度描述正确的一项. A.来自设置为不可编辑的输入框的内容可信任 B.来自设置为隐藏域的内容可信任 C.来自客户端提交Cookie的内容可信任 D.来自客户端提交的Agent域的内容可信任 E.以上内容均不可信 正确答案:E; 6.中如提交多个参数通过下列哪个符号进行分隔? A.; B., C.& D.+ 正确答案:C; 7.通过以下哪种方法可最为有效地避免在中括号参数产生SQL注入?select * from users where age<[18] and male=1; A.过滤输入中的单引号 B.过滤输入中的分号.--与#;过滤输入中的空格.TAB<\t> C.如输入参数非正整数则认为非法,不再进行SQL查询 D.过滤关键字and、or 正确答案:D; 8.端口扫描使用的最常见协议是 A.TCP B.UDP C.ICMP 正确答案:A; 9.判断主机存活最常用协议是 A.TCP B.UDP C.ICMP 正确答案:C; 10.哪种扫描器不能对Web应用的安全性问题进行评估 A.Webinspect B.APPscan C.Nmap 正确答案:C; 11.微软何类产品的漏洞利用方式与挂马相关 A.操作系统 B.浏览器 C.Office 正确答案:B; 12.以下关于僵尸网络的正确答案是 A.拒绝服务攻击 B.垃圾 C.网络钓鱼 D.以上均是 正确答案:D; 13.口令安全不取决于 A.口令长度 B.口令复杂度 C.口令的更换周期 D.口令是否合理存放 E.口令是否便于记忆 正确答案:E; 14.风险评估应当以什么为核心 A.脆弱性 B.威胁 C.资产 正确答案:C; 15.以下哪种攻击手法对终端安全产生的威胁最大 A.挂马 B.黑客利用某系统漏洞〔如MS06-040〕进行远程渗透 C.嗅探 D.黑客攻击某企业门户,造成不可访问 正确答案:A; 16.下列内容不属于信息安全的"CIA"属性的是 A.##性 B.不可篡改性 C.完整性 D.可用性 正确答案:B; 17.在windows系统中,查看共享情况使用的命令是 A.net use B.net share C.net ping D.arp –a 正确答案:B; 18.国际常见的信息安全管理体系标准是 A.Cobit B.COSO C.SOX D.ISO27001 正确答案:D; 19.显示C盘上所有创建时间的递归式目录清单的命令是 A.dir /t:a /a /s /o:d c:\ B.dir /t:w /a /s /o:d c:\ C.dir /t:c /a /s /o:d c:\ D.dir /a /s /o:d c:\ 正确答案:C; 20.Windows系统的系统日志存放在 A.c:\windows\system32\config B.c:\windows\config C.c:\windows\logs D.c:\windows\system32\logs 正确答案:A; 21.如果/etc/passwd文件中存在多个UID为0的用户,可能是 A.系统被DDOS攻击 B.管理员配置错误 C.系统被入侵并添加了管理员用户 D.计算机被感染病毒 正确答案:C; 22.以下哪个命令可以查看ssh服务端软件包是否被修改 A.rpm –v ssh B.rpm –V sshd C.rpm –aq D.rpm –V ssh 正确答案:D; 23.在linux中存放用户信息的文件是 A./etc/passwd B./etc/login.def C./etc/shadow D./etc/group 正确答案:A; 24.发现入侵后,哪些动作是可以马上执行的 A.重启 B.关机 C.切断网络 D.进入单用户模式 正确答案:C; 25.删除linux中无用的账号,使用的命令是 A..userdel username B.usermode –L C.chmod –R D.usermode -F 正
《计算机网络安全》实验报告 实验名称: arp欺骗 提交报告时间: 年 月 日 1. 实验目的 程序实现ARP欺骗,对ARP欺骗进行进一步的认识并提出防范措施。 2. 系统环境 主机1 windows系统 主机2 windows系统 主机3 linux操作系统 3. 网络环境 同一网段下的网络 四、实验步骤与实验结果 将主机A、C、E为一组,B、D、F为一组。实验角色说明如下: "实验主机 "实验角色 " "主机A、B "目标主机一/Windows " "主机C、D "黑客主机/Linux " "主机E、F "目标主机二/Windows " 首先使用"快照X"恢复Windows/Linux系统环境。 一.ARP欺骗攻击 实验需求: (1)本实验使用交换网络结构(参见附录B),组一、二和三间通过交换模块连接(主 机A、C、E通过交换模块连接,主机B、D、F也通过交换模块连接)。因此,正常情况下 ,主机C无法以嗅探方式监听到主机A与主机E间通信数据,同样主机D也无法监听到主机 B与主机F间的通信数据。 (2)主机C要监听主机A和主机E间的通信数据;主机D要监听主机B与主机F间的通信数据 。 分析: 黑客主机通过对目标主机进行ARP欺骗攻击,获取目标主机间的通信数据。 1.正常通信 图6-1-1 目标主机正常通信示意图 (1)目标主机二单击工具栏"UDP工具"按钮,启动UDP连接工具,创建2513/udp服务端。 主机1发送数据 (2)目标主机一启动UDP连接工具,将"目标机器"IP地址指定为目标主机二的地址,目 标端口与服务器一致。在"数据"文本框中输入任意内容,单击"发送"按钮,向服务端发 数据。服务端确定接收到数据。 主机2接收到数据 (3)黑客主机单击工具栏"控制台"按钮,切换至/opt/ExpNIC/NetAD- Lab/Tools/ids目录(Snort目录),命令如下: 主机3 通过上述命令snort仅会监听源IP地址为目标主机一的、传输协议类型为UDP的网络 数据(详细的snort使用命令见实验10|练习一)。 (4)目标主机一再次向目标主机二发送消息,黑客主机停止snort监听(Ctrl+C),观 察snort监听结果,是否监听到目标主机间的通信数据。为什么? 主机1向主机2发送消息 主机3不能监听到主机1发送到的数据 因为命令snort只会监听源IP地址为目标主机一的、传输协议类型为UDP的网络数据,并 不能截获数据 (5)目标主机一查看ARP缓存表,确定与目标主机二的IP相映射的MAC地址是否正常。 此时主机1arp缓存正常 2.ARP攻击 图6-1-2 ARP攻击示意图 (1)黑客主机单击平台工具栏"控制台"按钮,进入实验目录,运行ARPattack程序攻击 目标主机一,将其ARP缓存表中与目标主机二相映射的MAC地址更改为黑客主机的MAC地址 ,命令如下: 其中第一个参数为被攻击主机IP地址,第二个参数为被攻击主机MAC地址,第三个 参数为与被攻击主机进行正常通信的主机IP地址。 通过上述命令在目标主机一的ARP缓存表中,与目标主机二IP相绑定的MAC被更改为黑客 主机MAC。 (2)黑客主机启动snort,同样监听源IP地址为目标主机一的、传输协议类型为UDP的网 络数据。 (3)目标主机一继续向目标主机二发送数据,目标主机二是否接收到数据?目标主机间 的通信是否正常?黑客主机停止snort监听,观察snort监听结果,是否监听到目标主机 间的通信数据。为什么?主机2不能接收到数据,通信不正常 主机1发送数据"ee" 主机三监听到发送的数据"ee" 因为运行ARPattack程序攻击目标主机一,将其ARP缓存表中与目标主机二相映射的M AC地址更改为黑客主机的MAC地址,主机3已经截获了主机1发给主机2的数据;命令snor t会监听源IP地址为目标主机一的、传输协议类型为UDP的网络数据。 (4)目标主机一查看ARP缓存表,确定与目标主机二的IP相映射的MAC地址是否正常。 Ip为主机2ip,但MAC已经改成黑客主机的MAC地址了 3.单向欺骗 正如步骤2中所示的实验现象,在黑客实施了简单的ARP攻击后,目标主机二会接收不到 目标主机一的消息,在接下来的时间里目标主机一、二很容易会对网络状况产生怀疑。 他们会去查看并修改ARP缓存表。所以应尽量减少目标主机由于受到ARP攻击而表现出的 异常,将黑客主机做为"中间人",将目标主机一发送的数据转发给目标主机二,是一种 很可行的方法。 图6-1-3 ARP单向欺骗示意图 (1)黑客主机开启路由功能,具体操作如下: 在控制台中输入命令:echo 1 >/proc/sys/net/ipv4/ip_forward 主机3 (2)黑客主机捕获来自目标主机一的数据包,并将

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值