即使某些人在文本框输入了drop table ***之类的语句,也是当做文本提交到数据库了啊,没有造成任何危害啊如果说有点危害我是觉得,如果输入了什么<div style="center"></div>再加些格式之类的,又比如<iframe>的有些危害,有的话审核的时候删掉就OK乐,可是数据库方面没有被破坏啊为什么说只是一定程度上防止了SQL的注入呢达人解释一下吧
调试欢乐多
关于sql注入的介绍挺多的
参数化可以完全防止SQL注入到目前为止,我还没有看到参数化之后被注入的例子
大家都说一定程度上,是怕万一被注入了,还有后退的余地
我认为是一种不负责任的做法
技术上的事情,不要用可能,很大程度上之类来形容,有就是有,没有就是没有凡是认为参数化不能完全防止SQL注入的,写出代码示例和实际注入过程
所谓有图有真相,完全靠猜测说能不能注入,说可能性是不是会增大之类,没有任何意义
呵呵,请问用存储过程和用SQL 参数化 只从安全性方面考虑,是不是一样的呢
不一样
用存储过程,如果在存储过程的代码里,还是采用SQL拼接的方式构造SQL语句,照样会引起注入问题
"update table set aa="+aa;
我说的是这种,只要有参数就用这样的格式
sqlparameter ****
"update table set aa=@aa"
这样写SQL语句,和用存储过程是一样的吗?只从安全方面?
如果它有自己的编码方式,那可以构造和SqlParameter一样的编码方式进行注入SQL
不管你怎么写,关键在于参数
你写了存储过程updateXXX,如果调用的时候传递进去的参数仍然采用 SQL = "Exec updateXXX " + aa;
这样的方式,那仍然是有注入危险的。参数化和写存储过程防止注入,根本就是两回事
网上很多东西,需要你自己动脑经去想,动手去实践
就如sql="select * from user where name=@name" (@name由用户输入的),这样注入不了。
如果说最后生成的sql只要是动态拼接的,都可以被注入。
就如sql="select * from user @where" (@where="name='"+name+"'",这里的变量name由用户输入的),这个写法虽然也用了参数化,但是还是可以被注入,这样的sql就等于sql="select * from user where name='"+name+"'"一样的,肯定能被注入。其实这时只要把name替换1个单引号成2个单引号就可以防止注入了,我一般name=name.Replace("'","''");人家还说还要过滤其他关键字,其实没必要,其他关键字之所以能威胁数据库,是因为先破了单引号,只有在这之后关键字才起作用。只要把1个单引号成2个单引号后,这些关键字就没效果了。所以说不管是存储过程带参数还是sql带参数,只要最后执行的sql是动态拼接的话,还是可能被注入的。