PHP 安全及相关

时间:2010-01-08 08:24:24   来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:在简化用PHP中写入大量文本文件的过程的实例函数:<?PHPfunction write_text($filename, $text="") {static $open_files = array();// 如果文件名空,关闭全部文件if ($filename == NULL) {foreach($open_files as $fr) {...
  正文:

关注安全问题的重要性
看到的远非全部

阻止用户恶意破坏你的程式最有效却经常被忽略的方法是在写代码时就考虑它的可能性。留意代码中可能的安全问题是很重要的。考虑下边的旨在简化用PHP中写入大量文本文件的过程的实例函数:




<?PHP
function write_text($filename, $text="") {
static $open_files = array();
// 如果文件名空,关闭全部文件
if ($filename == NULL) {
foreach($open_files as $fr) {
fclose($fr);
}
return true;
}
$index = md5($filename);
if(!isset($open_files[$index])) {
$open_files[$index] = fopen($filename, "a+");
if(!$open_files[$index]) return false;
}
fputs($open_files[$index], $text);
return true;
}
?>

这个函数带有两个缺省参数,文件名和要写入文件的文本。
函数将先检查文件是否已被打开;如果是,将使用原来的文件句柄。否则,将自行创建。在这两种情况中,文本都会被写入文件。
如果传递给函数的文件名是NULL,那么所有打开的文件将被关闭。下边提供了一个使用上的实例。
如果开发者以下边的格式来写入多个文本文件,那么这个函数将清楚和易读的多。
让我们假定这个函数存在于一个单独的文件中,这个文件包含了调用这个函数的代码。
下边是一个这样的程式,我们叫它quotes.PHP:

<HTML><body>
<form action="<?=$_SERVER['PHP_SELF']?>" method="get">
Choose the nature of the quote:
<select name="quote" size="3">
<option value="funny">Humorous quotes</option>
<option value="political">Political quotes</option>
<option value="love">Romantic Quotes</option>
</select><br />
The quote: <input type="text" name="quote_text" size="30" />
<input type="submit" value="Save Quote" />
</form>
</body></HTML>
<?PHP
include_once('write_text.PHP');
$filename = "/home/web/quotes/{$_GET['quote']}";
$quote_msg = $_GET['quote_text'];
if (write_text($filename, $quote_msg)) {
echo "<center><hr><h2>Quote saved!</h2></center>";
} else {
echo "<center><hr><h2>Error writing quote</h2></center>";
}
write_text(NULL);
?>

如同你看到的,这位开发者使用了write_text()函数来创建一个体系使得用户可以提交他们喜欢的格言,这些格言将被存放在一个文本文件中。
不幸的是,开发者可能没有想到,这个程式也允许了恶意用户危害web server的安全。
也许现在你正挠着头想着究竟这个看起来很无辜的程式怎样引入了安全风险。
如果你看不出来,考虑下边这个URL,记住这个程式叫做quotes.PHP:

http://www.somewhere.com/fun/quotes.PHP?quote=different_file.dat&quote_text=garbage+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程式只有在最弱的安全链接下才安全,所以确认这些可能不安全的链接是否安全很重要。

常见的涉及安全的错误

这里给出一些要点,一个可能危及安全的编码上的和管理上的失误的简要不完整列表
来源:http://www.002pc.com/master/College/Programming/PHP/11606.html

收藏到:

关于《PHP 安全及相关》文章的评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

随机文章

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by rand() limit 10

顶出来的热门

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by diggtop desc,id desc limit 10
站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td