https://translate.google.com.hk/translate?hl=zh-CN&sl=zh-TW&u=https://zh.wikipedia.org/zh/SQL%25E8%25B3%2587%25E6%2596%2599%25E9%259A%25B1%25E7%25A2%25BC%25E6%2594%25BB%25E6%2593%258A&prev=search
例子
某个网站的登入验证的SQL查询代码为
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '" + passWord + "');"
恶意填入
userName = "1' OR '1'='1" ;
与
passWord = "1' OR '1'='1" ;
时,将导致原本的SQL字串被填为
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;"
因此达到无帐号密码,亦可登入网站。 所以SQL隐码攻击被俗称为骇客的填空游戏。
可能造成的伤害
资料表中的资料外泄,例如企业及个人机密资料,帐户资料,密码等。资料结构被骇客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。资料库伺服器被攻击,系统管理员帐户被窜改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。取得系统较高权限后,有可能得以在网页加入恶意连结、恶意代码以及Phishing等。经由资料库伺服器提供的作业系统支援,让骇客得以修改或控制作业系统(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服务)。骇客经由上传php简单的指令至对方之主机内,PHP之强大系统命令,可以让骇客进行全面控制系统(例如:php一句话木马)。破坏硬碟资料,瘫痪全系统(例如xp_cmdshell "FORMAT C:")。取得系统最高权限后,可针对企业内部的任一管理系统做大规模破坏,甚至让其企业倒闭。企业网站首页被窜改,门面尽失。
避免的方法
在设计应用程式时,完全使用参数化查询 (Parameterized Query)来设计资料存取功能。在组合SQL字串时,先针对所传入的参数加入其他字元(将单引号字元前加上跳脱字元)。如果使用PHP开发网页程式的话,需加入跳脱字元之功能(自动将所有的网页传入参数,将单引号字元前加上跳脱字元)。使用php开发,可写入html特殊函式,可正确阻挡XSS攻击。其他,使用其他更安全的方式连接SQL资料库。 例如已修正过SQL资料隐码问题的资料库连接元件,例如ASP.NET的SqlDataSource物件或是LINQ to SQL。使用SQL防注入系统。增强WAF的防御力