代码能 什么样的 PHP 代码能有效避开恶意程序
阻止用户恶意破坏你的程式最有效却经常被忽略的方法是在写代码时就考虑它的可能 性。留意代码中可能的安全问题是很重要的。考虑下边的旨在简化用 PHP 中写入大量文本 文件的过程的实例函数:
这个函数带有两个缺省参数,文件名和要写入文件的文本。 函数将先检查文件是否已被打开; 如果是, 将使用原来的文件句柄。 否则, 将自行创建。
在这两种情况中,文本都会被写入文件。 如果传递给函数的文件名是 NULL,那么所有打开的文件将被关闭。下边提供了一个使 用上的实例。 如果开发者以下边的格式来写入多个文本文件,那么这个函数将清楚和易读的多。 让我们假定这个函数存在于一个单独的文件中,这个文件包含了调用这个函数的代码。 下边是一个这样的程式,我们叫它 quotes.PHP:
Quote saved!
"; } else { echo "
Error writing quote
"; } write_text(NULL); ?>
如同你看到的,这位开发者使用了 write_text()函数来创建一个体系使得用户可以提交 他们喜欢的格言,这些格言将被存放在一个文本文件中。 不幸的是,开发者可能没有想到,这个程式也允许了恶意用户危害 web server 的安全 也许现在你正挠着头想着究竟这个看起来很无辜的程式怎样引入了安全风险。 如果你看不出来,考虑下边这个 URL,记住这个程式叫做 quotes.PHP: somewhere/fun/quotes.PHP?quote=different_file.dat&;quote_text=garba ge+data 当这个 URL 传递给 web server 时将会发生什么?
显然,quotes.PHP 将被执行,但是,不是将一句格言写入到我们希望的三个文件中之 一,相反的,一个叫做 different_file.dat 的新文件将被建立,其中包含一个字符串 garbage data。 显
然,这不是我们希望的行为,恶意用户可能通过把 quote 指定为../../../etc/passwd 来访问 UNIX 密码文件从而创建一个帐号(尽管这需要 web server 以 superuser 运行程式, 如果是这样的,你应该停止阅读,马上去修复它)。 如果/home/
web/quotes/可以通过浏览器访问, 可能这个程式最严重的安全
问题是它允 许任何用户写入和运行任意 PHP 程式。这将带来无穷的麻烦。 这里有一些解决
方案。 如果你只需要写入目录下的一些文件, 可以考虑使用一个相关的 数组来存放文件名。如果用户输入的文件存在于这个数组中,就可以安全的写入。另一个想 法是去掉所有的不是数字和字母的字符来确保没有目录分割符号。 还有一个办法是检查文件 的扩展名来保证文件不会被 web server 执行。 原则很简单,作为一个开发者你必须比程式在你希望的情况下运行时考虑更多。 如果非法数据进入到一个 form 元素中会发生什么?恶意用户是否能使你的程式以不希 望的方式运行?什么方法能阻止这些攻击?你的 web server 和
PHP 程式只有在最弱的安全 链接下才安全