随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
定义用户可以提交一段数据库查询代码,根
据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
代码注入的用途蓄意的用途恶意使用
代码注入的使用一般被视为心怀恶意的举动,而它确实常常如此。透过代码注入技术在黑或者破解系统上,以获取信息、提权、或者非法访问某系统是相当流行的。
恶意用途的代码注入可包括:
透过SQL注入(见下文)随意修改数据库中的值。影响所及可从某网站外观损毁,到对敏感数据严重的破坏。
当用户拜访恶意网站时,透过网页浏览器或其插件的漏洞安全隐患,进行代码注入,以便安装流氓软件到用户机器上。
透过PHP或者ASP注入安装流氓软件或者运行恶意代码于服务端。
于UNIX系统利用Shell注入安全隐患对setuid root二进制数据作修改,达成提权到root使用权限的目的。
于视窗系统利用Shell注入安全隐患对系统服务做手脚,达成提权到本地端系统使用权限的目的。
从网页浏览器利用HTML/脚本注入(跨网站脚本)进行连线窃取 / cookies窃取进而冒充他人,获取他人个人敏感数据。
善意使用
某些人可能会出于善意而使用代码注入。例如,透过代码注入以改变或者调试某程序或者系统的行为可以"摆弄"系统以某种方式表现其行为而不怀任何恶意。打比方说:
代码注入可以添入某原本搜索结果页面设计上没有的字段,方便用户。
透过对原本设计默认函数没有曝光的字段赋值,代码注入可提供一个全新的方式来过滤、排序、或者归类数据。
这些人诉诸此种替代手段大致是下面几种原因之一:
对软件中希望改进函数进行润饰的其他方法证明不可能,或者
其他对软件修改的方式代价过高,或者
其他对软件修改的方式过度艰苦。
一般开发社群对以此为目的的代码注入不表欢迎。他们称这种行为为三脚猫、半调子、或者骇 / 黑程序。(kludge or hack)
某些开发者允许或者甚至表扬代码注入的使用来“加强”他们的软件;通常是因为该方案提供了较不昂贵的方式来实现新的或者特殊化的功能。不幸的是,其副作用与无法列管的蕴含式可能相当危险。
一般来说,即使相当善意的代码注入使用都不被建议使用。1
非蓄意的用途某些用户可能会不经意的进行代码注入,因为他们对程序提供的输入,没列在当初开发系统者的考虑中。例如:
用户可能视某个包含表示字符或者字符字符串为合法输入,而不知该字符被开发者所保留而有特殊意义 (像 "张三 & 李四" 里的 "&" 字符,或者英文约翰的 M&M 巧克力: "John's M&M's"里头的单引号)。
用户可能会提交格式错乱的文件做为输入。这种行为对单一程序没什么问题,但可能对整个接收系统是灾难。2
避免代码注入要避免代码注入的种种问题,得充分发挥输入输出处理保全,例如:
输入确认。
更换危险字符。例如在PHP透过addslashes()函数保护SQL注入。
输入编码。
输出编码。
采用其他没有饱受代码注入漏洞困扰的编程实现,例如“参数化SQL查询” ("parameterized SQL queries" 又名 "prepared statements" 亦有时称 "bind variables")2
本词条内容贡献者为:
黎明 - 副教授 - 西南大学