PHP的safe_mode選項的目的是為瞭解決本章所述的某些問題。<br />但是,在PHP層面上去解決這類問題從架構上來看是不正確的,正如PHP手冊所述(http://php.net/features.safe-mode)。<br />當安全模式生效時,PHP會對正在執行的指令碼所讀取(或所操作)檔案的屬主進行檢查,以保證與該指令碼的屬主是相同的。<br />雖然這樣確實可以防範本章中的很多例子,但它不會影響其它語言編寫的程式。<br />例如,使用Bash寫的CGI指令碼:<br />#!/bin/bash<br />echo "Content-Type:text/plain"<br />echo ""<br />cat /home/victim/inc/db.inc<br />Bash解析器會去關心甚至檢查PHP設定檔中的開啟安全模式的配置字串嗎?<br />當然不會。同樣的,該伺服器支援的其它語言,如Perl,Python等都不會去關心這個。<br />本章中的所有例子可以很簡單地被改編成其它程式設計語言。<br />另一個典型的問題是安全模式不會拒絕屬於WEB伺服器檔案的訪問。<br />這是由於一段指令碼可以用於建立另一段指令碼,而新指令碼是屬於WEB伺服器的,因此它可以訪問所有屬於WEB伺服器的檔案:<br /><?php<br />$filename='file.php';<br />$script='<?php<br />header(/'Content-Type:text/plain/');<br />readfile($_GET[/'file/']);<br />?>';<br />file_put_contents($filename,$script);<br />?><br />上面的指令碼建立了下面的檔案:<br /><?php<br />header('Content-Type:text/plain');<br />readfile($_GET['file']);<br />?><br />由於該檔案是由Web伺服器所建立的,因此它的屬主是Web伺服器(Apache一般以nobody使用者運行):<br />$ls file.php<br />-rw-r--r-- 1 nobody nobody 72 May 21 12:34 file.php</p><p>因此,這個指令碼可以繞過很多安全模式所提供的安全措施。<br />即使開啟了安全模式,攻擊者也能顯示一些資訊如儲存在/tmp目錄內的會話資訊,<br />這是由於這些檔案是屬於Web伺服器的(nobody)。<br />PHP的安全模式確實起到了一些作用,可以認為它是一種深度防範機制。<br />可是,它只提供了可憐的保護,同時在本章中也沒有其它安全措施來替代它。