参数化SQL能防止注入的原理

mlxwl2013 2013-12-12 09:32:28
如题,很多人认为参数化就是‘’自动过滤‘’,我认为不对,大家讲讲看原理是什么。
...全文
629 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 9 楼 fcuandy 的回复:
[quote=引用 4 楼 mlxwl2013 的回复:] [quote=引用 3 楼 fcuandy 的回复:] 你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
你这话等于没说,要搞清楚了‘’原理‘’,我还就不问这个了。[/quote] 那我给你说下结果吧, 结果是不能。 关于SQL注入的源理,百度搜,先学学吧, 弄不懂的地方再来问。[/quote] 现在我问的不就是弄不懂的地方吗?sql注入的原理,百度有很多篇了,难辨真伪,关于能否完全防止注入,有些说能,有些说不能。你说不能,最好说下原因,举个简单易懂的反例。
發糞塗牆 2013-12-13
  • 打赏
  • 举报
回复
攻击永远比防御强,而且不存在没有漏洞的系统,“完全”防止是不可能的,只能说把现有出现过和能预估的风险降低而已
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
引用 4 楼 mlxwl2013 的回复:
[quote=引用 3 楼 fcuandy 的回复:] 你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
你这话等于没说,要搞清楚了‘’原理‘’,我还就不问这个了。[/quote] 那我给你说下结果吧, 结果是不能。 关于SQL注入的源理,百度搜,先学学吧, 弄不懂的地方再来问。
LongRui888 2013-12-13
  • 打赏
  • 举报
回复
引用 7 楼 mlxwl2013 的回复:
[quote=引用 6 楼 yupeigu 的回复:] [quote=引用 5 楼 mlxwl2013 的回复:] [quote=引用 2 楼 yupeigu 的回复:] 参数化也不能完全解决 sql注入问题,还是建议你使用其他的,比如 正则表达式等过滤特殊字符: 如何防止sql注入 http://www.blogjava.net/GavinMiao/archive/2011/08/24/357182.html
我觉得参数化应该能完全解决注入问题,至少一般的增删查改用参数化是非常安全的[/quote] 对了,你看了上面版主贴的连接不,里面说参数化也不能完全防止sql注入,他说只有重用执行计划,才能防止sql注入,你觉得说的对吗?[/quote]我觉得那篇写得有些问题,下面的评论质疑的也很多,我个人赞同45,46楼的说法[/quote] 嗯,我看了一下,也觉得这个文章写的不太对,觉得这个参数化查询是否能解决 sql注入,和这个执行计划重用,一点关系也没有。 不过,他里面的sp_executesql 确实能防止参数注入,而且这个很exec 拼接的动态语句,还不太一样。
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
[quote=引用 5 楼 mlxwl2013 的回复:] [quote=引用 2 楼 yupeigu 的回复:] 参数化也不能完全解决 sql注入问题,还是建议你使用其他的,比如 正则表达式等过滤特殊字符: 如何防止sql注入 http://www.blogjava.net/GavinMiao/archive/2011/08/24/357182.html
我觉得参数化应该能完全解决注入问题,至少一般的增删查改用参数化是非常安全的[/quote] 对了,你看了上面版主贴的连接不,里面说参数化也不能完全防止sql注入,他说只有重用执行计划,才能防止sql注入,你觉得说的对吗?[/quote]我觉得那篇写得有些问题,下面的评论质疑的也很多,我个人赞同45,46楼的说法
LongRui888 2013-12-13
  • 打赏
  • 举报
回复
引用 5 楼 mlxwl2013 的回复:
[quote=引用 2 楼 yupeigu 的回复:] 参数化也不能完全解决 sql注入问题,还是建议你使用其他的,比如 正则表达式等过滤特殊字符: 如何防止sql注入 http://www.blogjava.net/GavinMiao/archive/2011/08/24/357182.html
我觉得参数化应该能完全解决注入问题,至少一般的增删查改用参数化是非常安全的[/quote] 对了,你看了上面版主贴的连接不,里面说参数化也不能完全防止sql注入,他说只有重用执行计划,才能防止sql注入,你觉得说的对吗?
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
参数化也不能完全解决 sql注入问题,还是建议你使用其他的,比如 正则表达式等过滤特殊字符: 如何防止sql注入 http://www.blogjava.net/GavinMiao/archive/2011/08/24/357182.html
我觉得参数化应该能完全解决注入问题,至少一般的增删查改用参数化是非常安全的
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 3 楼 fcuandy 的回复:
你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
你这话等于没说,要搞清楚了‘’原理‘’,我还就不问这个了。
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
LongRui888 2013-12-13
  • 打赏
  • 举报
回复
参数化也不能完全解决 sql注入问题,还是建议你使用其他的,比如 正则表达式等过滤特殊字符: 如何防止sql注入 http://www.blogjava.net/GavinMiao/archive/2011/08/24/357182.html
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 21 楼 fcuandy 的回复:
[quote=引用 20 楼 mlxwl2013 的回复:] [quote=引用 19 楼 fcuandy 的回复:] execute('select * from tb where id=' + @id + ' and name=''' + @name + '''') 上面有手误,更正一下。
不在sql里执行execute这种动态执行的东东,用参数化应该不会有问题了吧。 或者说只在.net里执行比较简单的增删查改语句,并且用参数化,应该不会被注入?是这样吗? [/quote] 一般来说是的。[/quote] 本贴加到了88分,感谢大家解答。
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 21 楼 fcuandy 的回复:
[quote=引用 20 楼 mlxwl2013 的回复:] [quote=引用 19 楼 fcuandy 的回复:] execute('select * from tb where id=' + @id + ' and name=''' + @name + '''') 上面有手误,更正一下。
不在sql里执行execute这种动态执行的东东,用参数化应该不会有问题了吧。 或者说只在.net里执行比较简单的增删查改语句,并且用参数化,应该不会被注入?是这样吗? [/quote] 一般来说是的。[/quote] 明白了,多谢大牛指点。
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
引用 20 楼 mlxwl2013 的回复:
[quote=引用 19 楼 fcuandy 的回复:] execute('select * from tb where id=' + @id + ' and name=''' + @name + '''') 上面有手误,更正一下。
不在sql里执行execute这种动态执行的东东,用参数化应该不会有问题了吧。 或者说只在.net里执行比较简单的增删查改语句,并且用参数化,应该不会被注入?是这样吗? [/quote] 一般来说是的。
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 19 楼 fcuandy 的回复:
execute('select * from tb where id=' + @id + ' and name=''' + @name + '''') 上面有手误,更正一下。
不在sql里执行execute这种动态执行的东东,用参数化应该不会有问题了吧。 或者说只在.net里执行比较简单的增删查改语句,并且用参数化,应该不会被注入?是这样吗?
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
execute('select * from tb where id=' + @id + ' and name=''' + @name + '''') 上面有手误,更正一下。
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
嗯,麻烦您打了那么多,谢谢了。
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
补充一点上贴, 实际注入中,并不是我上面写的那么简单,因为一般情况,你不知道别人的库结构是如何的, 这时候其实要靠注入经验、猜测、还要看当前的数据库帐号权限有多大等等。 当然, 即便当前帐号只有对业务表的操作权 不能威胁到服务器,那么你想想, 一条update 金额已经有足够大的损失了。 最直观的反例是sql_excutesql里面还在拼SQL,这个是最容易表述也是最简单的, 这样的方式就完全没有用。 这个告诉我们, 不要以为别人说怎么样就可以怎么样了, 你懂了原理,就知道这些东西不能道听途说。 区分真伪的能力在于你掌握了多少。
create proc p
(@id int,
@name varchar(10))
as
begin
 execute('select * from tb where id=' + @id + ' and name=''' + @name + ''')
end
go
在c#里,调用这个存储过程,给了两个参数,一个@id,一个@name 是的,@name,@id被定义了类型, @name里的字串被进行了转义, 乍一看没问题, 事实呢? 只是构造相对再复杂一点而已, 只要你脑子够清楚不被'和''搞晕, 一样的。 sqlparamepter pm = .... pm[0].value=1; pm[1].value="a'"; 那么在execute里执行里面拼的语句已经是 select * from tb where id=1 and name=''a''' 你会说这条语句报错,因为定界符不匹配, 对的,你说对了, 为什么定界符不匹配,因为构造非法的字符串造成了定界符不匹配,既然已经干扰了定界符, 能过合理构造,你就能构造出你想要的语句。 这么说应该能说明吧, 不用我再构造清一次你的admins表吧。 这些是最直观的例子。 你会说,你通过避免拼动态语句来解决这个问题, 对的,可以解决。 但是会有更高阶的东西, 利用本身操作系统或者数据库服务器的一些漏洞(一般是较低层的,比如某某溢出),通过SQL注入,结合一些方法,完成攻破。 这个就不光是纯SQL的注入了,就不多介绍了。 9年前对这些东西感兴趣,弄过一些,包括国内知名的两个商业论坛, 后来淡了,这些东西没有再过多了解, 但是原理是不变的。 随手敲的,可能手误,见谅。
fcuandy 2013-12-13
  • 打赏
  • 举报
回复
引用 11 楼 mlxwl2013 的回复:
[quote=引用 9 楼 fcuandy 的回复:] [quote=引用 4 楼 mlxwl2013 的回复:] [quote=引用 3 楼 fcuandy 的回复:] 你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
你这话等于没说,要搞清楚了‘’原理‘’,我还就不问这个了。[/quote] 那我给你说下结果吧, 结果是不能。 关于SQL注入的源理,百度搜,先学学吧, 弄不懂的地方再来问。[/quote] 现在我问的不就是弄不懂的地方吗?sql注入的原理,百度有很多篇了,难辨真伪,关于能否完全防止注入,有些说能,有些说不能。你说不能,最好说下原因,举个简单易懂的反例。 [/quote]
引用 11 楼 mlxwl2013 的回复:
[quote=引用 9 楼 fcuandy 的回复:] [quote=引用 4 楼 mlxwl2013 的回复:] [quote=引用 3 楼 fcuandy 的回复:] 你先了解下什么是SQL注入的原理, 然后就知道参数化怎么防注入,到底能不能完全防注入。
你这话等于没说,要搞清楚了‘’原理‘’,我还就不问这个了。[/quote] 那我给你说下结果吧, 结果是不能。 关于SQL注入的源理,百度搜,先学学吧, 弄不懂的地方再来问。[/quote] 现在我问的不就是弄不懂的地方吗?sql注入的原理,百度有很多篇了,难辨真伪,关于能否完全防止注入,有些说能,有些说不能。你说不能,最好说下原因,举个简单易懂的反例。 [/quote] 这么说吧. 注入的思想就是构造非法的sql语句。 string sql="select * from tb where username='" + username + "'"; 现在如果,我大概知道你的管理员表的表名是 admins, 我要往里面加一条记录,或者清空你的管理员表, 针对于上面一条语句, 我需要构造的sql语句原型是: select * from tb where username='xxx'; truncate table admins 然后,注入的本质,就是通过构造字串, 让string sql这个变量的值成为我们想要构造的那条语句 当username的值为 aa';truncate table admins -- 拼接的结果就成了 string sql = "select * from tb where username='aa';truncate table admins --'"; 那么目的就达到了。 这种是最简单和基础的注入。 我们知道, .net或者其它语言里,在使用sqlserver为数据库, 以传参的方式执行的时候,在数据库端实际上是以 sp_executelsql 的方式实现的(关于这一点,你通过事件探查器就可以看到). 当给 string sql= "select ...where username=@username" @username已经在param里被定义为了字串类型, 即便 字串里有单引号,分号,SQL里的注释号, 这些都会被当作字串来处理,而不会当作sql里的定界符、指定符等等 当给@username传值为 "aa';truncate table admins --" 时 单引号被转义了, 用SQL来描述的话 相当于 declare @username varchar(xxx) @username='aa'';truncate table admins --' 整条SQL语句的作用实际上把 'aa'';truncate table admins --' 当作name值代入表中进行检索, 避免了注入的问题. 这样说应该可以理解吗? 同理,像 string sql="select ... where id=" + id.tostring(); 像c#这样的语言,因为id强类型为int, 这里一般情况下.net代码会报错,也能避免这种问题 像vb这类弱类型的语言, where id=" + id, 就经常出现这种问题, 对于这类语言,一种是强制要求变量及类型定义, 一种是用类似于isnumeric之类的函数去检测. 好了, 基本的注入方式我讲了一下, 现在举个反例, 倒底参数方式能不能防注入, 先回贴,下贴继续
發糞塗牆 2013-12-13
  • 打赏
  • 举报
回复
找不到那本书了,自己找找吧
mlxwl2013 2013-12-13
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
我不擅长这方面,只是见过书上一个例子,通过--这个,把一些条件注释掉,在类似登录判断时,让判断恒为真,这样就可以顺利登录数据库,接下来,甚至可以通过一些注释的方式,同样使用让sql语句恒为true。来满足你的操作,直到删除一个数据库为止。
要有具体的例子就好。
加载更多回复(3)
作 者:(美)克拉克 著,黄晓磊,李SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。   本书主要内容   SQL注入一直长期存在,但最近有所增强。本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。   什么是SQL注入?理解它是什么以及它的基本原理   查找、确认和自动发现SQL注入   查找代码中SQL注入时的提示和技巧   使用SQL注入创建利用   通过设计来避免由SQL攻击所带来的危险 目录: 第1章 什么是SQL注入  1.1 概述  1.2 理解Web应用的工作原理   1.2.1 一种简单的应用架构   1.2.2 一种较复杂的架构  1.3 理解SQL注入  1.4 理解SQL注入的产生过程   1.4.1 构造动态字符串   1.4.2 不安全的数据库配置  1.5 本章小结  1.6 快速解决方案  1.7 常见问题解答 第2章 SQL注入测试  2.1 概述  2.2 寻找SQL注入   2.2.1 借助推理进行测试   2.2.2 数据库错误   2.2.3 应用响应   2.2.4 SQL盲注  2.3 确认SQL注入   2.3.1 区分数字和字符串   2.3.2 内联SQL注入   2.3.3 终止式SQL注入   2.3.4 时间延迟  2.4 自动寻找SQL注入  2.5 本章小结  2.6 快速解决方案  2.7 常见问题解答 第3章 复查代码中的SQL注入  3.1 概述  3.2 复查源代码中的SQL注入   3.2.1 危险的编码行为   3.2.2 危险的函数   3.2.3 跟踪数据   3.2.4 复查PL/SQL和T-SQL代码  3.3 自动复查源代码第1章 什么是SQL注入   3.3.1 YASCA   3.3.2 Pixy   3.3.3 AppCodeScan   3.3.4 LAPSE   3.3.5 SWAAT   3.3.6 Microsoft SQL注入源代码分析器   3.3.7 CAT.NET   3.3.8 商业源代码复查工具   3.3.9 Ounce   3.3.10 Fortify源代码分析器   3.3.11 CodeSecure  3.4 本章小结  3.5 快速解决方案  3.6 常见问题解答 第4章 利用SQL注入  4.1 概述  4.2 理解常见的利用技术  4.3 识别数据库   4.3.1 非盲跟踪   4.3.2 盲跟踪  4.4 使用UINON语句提取数据   4.4.1 匹配列   4.4.2 匹配数据类型  4.5 使用条件语句   4.5.1 方法1:基于时间   4.5.2 方法2:基于错误   4.5.3 方法3:基于内容   4.5.4 处理字符串   4.5.5 扩展攻击   4.5.6 利用SQL注入错误   4.5.7 Oracle中的错误消息  4.6 枚举数据库模式   4.6.1 SQL Server   4.6.2 MySQL   4.6.3 Oracle  4.7 提升权限   4.7.1 SQL Server   4.7.2 Oracle  4.8 窃取哈希口令   4.8.1 SQL Server   4.8.2 MySQL   4.8.3 Oracle  4.9 带外通信   4.9.1 E-mail   4.9.2 HTTP/DNS   4.9.3 文件系统  4.10 自动利用SQL注入   4.10.1 Sqlmap   4.10.2 Bobcat   4.10.3 BSQL   4.10.4 其他工具  4.11 本章小结  4.12 快速解决方案  4.13 常见问题解答 第5章 SQL盲注利用  5.1 概述  5.2 寻找并确认SQL盲注   5.2.1 强制产生通用错误   5.2.2 注入带副作用的查询   5.2.3 拆分与平衡   5.2.4 常见的SQL盲注场景   5.2.5 SQL盲注技术  5.3 使用基于时间的技术   5.3.1 延迟数据库查询   5.3.2 基于时间推断的考虑  5.4 使用基于响应的技术   5.4.1 MySQL响应技术   5.4.2 SQL Server响应技术   5.4.3 Oracle响应技术   5.4.4 返回多位信息  5.5 使用非主流通道   5.5.1 数据库连接   5.5.2 DNS渗漏   5.5.3 E-mail渗漏   5.5.4 HTTP渗漏  5.6 自动SQL盲注利用   5.6.1 Absinthe   5.6.2 BSQL Hacker   5.6.3 SQLBrute   5.6.4 Sqlninja   5.6.5 Squeeza  5.7 本章小结  5.8 快速解决方案  5.9 常见问题解答 第6章 利用操作系统  6.1 概述  6.2 访问文件系统   6.2.1 读文件   6.2.2 写文件  6.3 执行操作系统命令  6.4 巩固访问  6.5 本章小结  6.6 快速解决方案  6.7 常见问题解答  6.8 尾注 第7章 高级话题  7.1 概述  7.2 避开输入过滤器   7.2.1 使用大小写变种   7.2.2 使用SQL注释   7.2.3 使用URL编码   7.2.4 使用动态的查询执行   7.2.5 使用空字节   7.2.6 嵌套剥离后的表达式   7.2.7 利用截断   7.2.8 避开自定义过滤器   7.2.9 使用非标准入口点  7.3 利用二阶SQL注入  7.4 使用混合攻击   7.4.1 修改捕获的数据   7.4.2 创建跨站脚本   7.4.3 在Oracle上运行操作系统命令   7.4.4 利用验证过的漏洞  7.5 本章小结  7.6 快速解决方案  7.7 常见问题解答 第8章 代码层防御  8.1 概述  8.2 使用参数语句   8.2.1 Java中的参数语句   8.2.2 .NET(C#)中的参数语句   8.2.3 PHP中的参数语句   8.2.4 PL/SQL中的参数语句  8.3 输入验证   8.3.1 白名单   8.3.2 黑名单   8.3.3 Java中的输入验证   8.3.4 .NET中的输入验证   8.3.5 PHP中的输入验证  8.4 编码输出  8.5 规范  8.6 通过设计来避免SQL注入的危险   8.6.1 使用存储过程   8.6.2 使用抽象层   8.6.3 处理敏感数据   8.6.4 避免明显的对象名   8.6.5 创建数据库Honeypot   8.6.6 附加的安全开发资源  8.7 本章小结  8.8 快速解决方案  8.9 常见问题解答 第9章 平台层防御  9.1 概述  9.2 使用运行时保护   9.2.1 Web应用防火墙   9.2.2 截断过滤器   9.2.3 不可编辑的输入保护与可编辑的输入保护   9.2.4 URL策略/页面层策略   9.2.5 面向方面编程   9.2.6 应用入侵检测系统   9.2.7 数据库防火墙  9.3 确保数据库安全   9.3.1 锁定应用数据   9.3.2 锁定数据库服务器  9.4 额外的部署考虑   9.4.1 最小不必要信息的泄露   9.4.2 提高Web服务器日志的冗余   9.4.3 在独立主机上部署Web服务器和数据库服务器   9.4.4 配置网络访问控制  9.5 本章小结  9.6 快速解决方案  9.7 常见问题解答 第10章 参考资料  10.1 概述  10.2 SQL入门  10.3 SQL注入快速参考   10.3.1 识别数据库平台   10.3.2 Microsoft SQL Server备忘单   10.3.3 MySQL备忘单   10.3.4 Oracle备忘单
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧