刚才看了两篇防止Sql注入攻击的文章,没弄明白什么是“参数化语句”, 也不知道什么是“拒绝包含二进制数据、转义序列和注释字符的输入内容” 目前我就是过滤一下单引号,上面提的都没听过,更别说用,我的系统肯定很不安全。好怕怕…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 注入能做到:1.字符型过滤单引号2.数值型判断是否为数值3.不使用动态拼sql串,也就是参数化(程序sqlcommand或动态拼sql时用sp_execute). 没弄明白什么是“参数化语句”, 也不知道什么是“拒绝包含二进制数据、转义序列和注释字符的输入内容”1、就是在你 的sql语句中尽量不要使用参数,这样的话能避免别人构造一些参数来进行注入。例如 id为1=12、注释字符的含义就是别人构造一个 --,例如构造的密码为--,这样的话你的验证密码就无效了 ,已经被注释掉了3、其他的依次类推。 参数化最简单的例子是:不使用exec('sql串'),而使用sp_executesql在.net程序里不拼串,而是使用sqlcommand. 只要这符过滤了单引号,数值型做了判断,存储过程里没有动态拼sql串,那么"拒绝包含二进制数据、转义序列和注释字符的输入内容"也就无意义了。 参数化语句的意思 就是使用参数 不要把用户提交的内容(比如url参数)直接拿去做tsql运算打个比方你有一个叫uid的内容很常见的 诸如http://www.microsoft.com/page.asp?uid=1本来你是要查询uid=1的编号的内容你的后台当然是这样写的 select ... from ... where uid=request.querystring("uid") --针对asp而言,其他其实一样好了 请注意了 如果你不处理我的url 我可以构造一个url比如http://www.microsoft.com/page.asp?uid='1=1 xp_cmdshell ''format c:'''我们看看你的sql执行什么select ... from ... where 1=1 xp_cmdshell 'format c:'因为1==1 tsql会执行下一句也就是格式化你的c盘当然以上文章是不考虑权限的情况下 不过sql注入就是这样的意思如果你改用参数化了 比如你写了个存储过程exec proc_uid @uid不管@uid你怎么构造 存储过程肯定返回错误 也就达到了你的目的了sql注入方式很多 以上这个是最老的一个了其实要避免还是很简单的 比如应用层和数据层之间加上中间层 专门用来构造sql语句,还有用存储过程也是一个办法 拒绝包含二进制数据、转义序列和注释字符的输入内容这个只是针对脚本攻击,一般是输入大量的二进制文本内容造成缓冲区溢出这个很难防范 其实也是现在防止tsql注入的新课题 关于 pivot的 group by {瘋子}-爱干活的民工=-==-数字排序问题 祝大家新年好!一个关于numeric数值型数据对比的问题? sql server XP专业版下如何建立数据库?如何建表? 关于DATATIME类型? 求一简单的统计sql语句 SqlServer表读取的性能问题,都来看看。 一个很菜的问题:从速SQL SERVER 中导出的sql语句中ON [PRIMARY]有什么作用 我采用ADO+SQLSERVER,众多客户端连着服务器端数据库,客户端同时直接对服务器端的数据记录添加\删除修改\,别的不做额外处理,会发生什么 sql2000不能安装 COUNT 的最大值
1.字符型过滤单引号
2.数值型判断是否为数值
3.不使用动态拼sql串,也就是参数化(程序sqlcommand或动态拼sql时用sp_execute).
2、注释字符的含义就是别人构造一个 --,例如构造的密码为--,这样的话你的验证密码就无效了 ,已经被注释掉了
3、其他的依次类推。
参数化最简单的例子是:
不使用exec('sql串'),而使用sp_executesql在.net程序里不拼串,而是使用sqlcommand.
打个比方
你有一个叫uid的内容很常见的 诸如http://www.microsoft.com/page.asp?uid=1
本来你是要查询uid=1的编号的内容
你的后台当然是这样写的 select ... from ... where uid=request.querystring("uid") --针对asp而言,其他其实一样
好了 请注意了 如果你不处理我的url 我可以构造一个url比如
http://www.microsoft.com/page.asp?uid='1=1 xp_cmdshell ''format c:'''
我们看看你的sql执行什么
select ... from ... where 1=1 xp_cmdshell 'format c:'
因为1==1 tsql会执行下一句也就是格式化你的c盘
当然以上文章是不考虑权限的情况下 不过sql注入就是这样的意思
如果你改用参数化了 比如你写了个存储过程
exec proc_uid @uid
不管@uid你怎么构造 存储过程肯定返回错误 也就达到了你的目的了
sql注入方式很多 以上这个是最老的一个了
其实要避免还是很简单的 比如应用层和数据层之间加上中间层 专门用来构造sql语句,还有用存储过程也是一个办法
这个只是针对脚本攻击,一般是输入大量的二进制文本内容造成缓冲区溢出
这个很难防范 其实也是现在防止tsql注入的新课题