SQL注入
SQL注入,就是通过在系统UI界面的表单填写带有slq语言的特殊字符串对系统数据库进行攻击的一种SQL命令。简单点说,就是一个系统的安全性如果不够好的话,很容易被有心人利用SQL语言编写字符串对系统进行攻击。
例子
Insert into TableName(field name) values('Text.text')
上面这行代码实现的就是一个向某个表中插入记录的功能。一般情况下,用户会按照UI界面的提示信息进行友好的输入;但是若是一个想搞破坏的用户,输入这样的字符串的话,对系统来说将是一种灾难:') delete TableName--')。如果没有对用户的输入信息进行安全检查的话,后面的delete的命令就会被sql数据库执行,系统的某个表将会遭受灭顶之灾,连个渣渣都不会剩。
解决方案
正所谓魔高一尺,道高一丈(PS:但是现实好像永远是道高一尺,魔高一丈来着),SQL注入的问题一度让人们头疼不已:就连我现在用来发表分享的优快云也曾在13年遭受被黑客通过SQL注入等技术泄露600多万用户信息的灾难。之后就是我们猜想的一样:欲除SQL注入而后快各种方案满天飞。这里只介绍正则表达式、参数化和数据架构这三种方法,至于为啥介绍这三种,因为他们简单啊~~~
正则表达式
private static readonly Regex RegInsert =
new Regex(@"\s?or\s*|\s?;\s?|\s?drop\s|\s?grant\s|^'|\s?--|\s?union\s|\s?delete\s|\s?truncate\s|" +
@"\s?sysobjects\s?|\s?xp_.*?|\s?syslogins\s?|\s?sysremote\s?|\s?sysusers\s?|\s?sysxlogins\s?|\s?sysdatabases\s?|\s?aspnet_.*?|\s?exec\s?",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
上面这个正则表达式就是检测用户输入信息中是否含有“、”、“‘’”和“-”等转换字符以及SQL语句的保留字WHERE、EXEC和DELETE等。参数化
string sql = "insert into category(name) values(@caName);
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caName", caName) };
通过对sql语句进行参数化处理,可以将诸如') delete TableName--')这样的用户输入当做字符串直接输入到数据库中制定的位置,而不是被数据库执行。架构
架构的话,主要是利用数据库自带的架构功能在表之前再加上一个架构的名字,这样用户只获取到表名也不能对数据库进行不友好的操作。(不过感觉架构的作用好像有点弱......)。
PS:选择具体数据库所属的安全性选项,而不是服务器的安全性选项。
总结
以上就是我对应对SQL注入的一些简单理解,希望能和路过的您共同交流学习。
感谢您的宝贵时间,祝生活愉快,谢谢~~~
—joker