编写安全的CGI脚本
不管在什么时候,一个程序与网络客户端联系的时候,就有可能客户端会攻击这个程序以获得未授权的访问。即使是无恶意地看看你的脚本也会你的系统的完整型构成危险。出于这种想法,本节教程将教你编写安全的脚本以避免任何的攻击。
首先要注意eval语句。PERL和Bourne shell语言为用户提供了一个eval命令,它允许你构造一个字符串并且有个注释器来执行这个字符串。这是一个不安全的隐患。我们来观察一下以下的语句,它是用Bource shell编写的:
eval `echo $QUERY_STRING | awk 'BEGIN{RS="&"} {printf "QS_%s\n",$1}' `
这条语句将查询字符串转换未一系列的可变的设置命令。但是不幸的是,这个脚本可以通过发送给它一个以逗号”;”开头的查询字符串来攻击。看看这有多么的危险!
其次,不要委任客户端做任何事情。一个品德好的客户端将会避免发送任何带有攻击性的查询字符串给Bourne shell,这样就会避免脚本错误解释字符串而导致一些不安全的事情。但是,”防人之心不可无”,对于哪些品德恶劣的客户端可能就会使用一些特殊的字符串来混淆你的脚本以获得未授权的访问。所以一定不要委托客户端做任何事情。
还要十分注意popen()和system()的使用。如果你使用任何来自客户端的数据构造一个命令行来调用popen()或者system(),要确信在任何字符之前加一个反斜杆,因为这样会在调用函数之前给Bourne shell以特殊的意义。具体做法你可以利用简短的C函数来实现。
最后,为了安全起见,关闭服务端附件(SSI)。如果很不幸,你的服务器支持SSI,那么请一定要为你的脚本目录关闭它!这个SSI可能被客户端滥用,他们可以偷看到他们发送的字符串直接输出的脚本。
本脚本只是概括性质地介绍安全的措施,如果有知道关于安全和WWW的问题,你可以参见一些WWW安全常见问题文本(FAQ)。