SQL Injection也称SQL指令注入式攻击,主要属于InputValidation的问题。它并非植入电脑病毒,而是描述了一个利用写入特殊SQL程序代码进行攻击。
一般输入帐号密码的网站的SQL语法为:select*frommemberwhereUID='"&request("ID")"'AndPasswd='"&request("Pwd")&"'
如果正常使用者帐号A123456789,密码1234
select*frommemberwhereUID='A123456789'AndPasswd='1234'
输入的帐号与密码会取代ASP中的变量,并被两个单引号所包住
select*frommemberwhereUID='"&request("ID")&"'AndPasswd='"&request("Pwd")&"'
若攻击者已知系统中有一个Admin的管理者帐号,则输入Admin'--,即可不需输入密码而进入资料库
select*frommemberwhereUID='Admin'--'AndPasswd=''
注:--符号后面的任何叙述都会被当作注解
一旦恶意使用者输入使用者帐号'or 1=1--,密码asdf1234(任意输入)
select*frommemberwhereUID=''or1=1--'AndPasswd='asdf1234'
一旦恶意使用者输入使用者帐号abcdef(任意输入),密码asdf(任意输入)'or1=1--
select*frommemberwhereUID='abcdefg'AndPasswd='asdf'or1=1--'
SQLInjection的危害是很大的,比如对于SQLServer,可以创建、删除数据库,执行系统命令等等,如droptabletbl_name,executemaster.dbo.xp_cmdshell"command"所以很多人写的函数就是拼命的去过滤这些可能引起危害的关键词,比如drop,分号,and,exe,mid等等,罗列了一大堆。
其实,尽可以不必那么繁琐,非要把简单的事情复杂化。对于过滤,ASP中只要针对字符型和数字型分别处理就可以了。字符型的,把单引号转换成两个单引号 strTmp=Replace(Trim(str),"'","''")。数字型的,就判断是否能够转换成数字型的,用isNumeric函数。
参考资料:精通SqlInjection技术
一个asp函数,解决SQLInjection漏洞