php的safe_mode選項的目的是為了解決本小節前後所述的某些問題。但是,在php層面上去解決這類問題從架構上來看是不正確的,正如php手冊所述(
當安全模式生效時,php會對正在執行的指令碼所讀取(或所操作)檔案的屬主進行檢查,以保證與該指令碼的屬主是相同的。雖然這樣確實可以防範本章中的很多例子,但它不會影響其它語言編寫的程式。例如,使用bash寫的cgi指令碼:
#!/bin/bash
echo "content-type: text/plain"
echo ""
cat /home/victim/inc/db.inc
bash解析器會去關心甚至檢查php配置檔案中的開啟安全模式的配置字串嗎?當然不會。同樣的,該伺服器支援的其它語言,如perl,python等都不會去關心這個。本專題中的所有例子可以很簡單地被改編成其它程式語言。
另乙個典型的問題是安全模式不會拒絕屬於web伺服器檔案的訪問。這是由於一段指令碼可以用於建立另一段指令碼,而新指令碼是屬於web伺服器的,因此它可以訪問所有屬於web伺服器的檔案:
<?php
$filename = 'file.php';
$script = '<?php
header(\'content-type: text/plain\');
readfile($_get[\'file\']);
?>';
file_put_contents($filename, $script);
?>
上面的指令碼建立了下面的檔案:
<?php
header('content-type: text/plain');
readfile($_get['file']);
?>
由於該檔案是由web伺服器所建立的,因此它的屬主是web伺服器(apache一般以nobody使用者執行):
$ ls file.php
-rw-r--r-- 1 nobody nobody 72 may 21 12:34 file.php
因此,這個指令碼可以繞過很多安全模式所提供的安全措施。即使開啟了安全模式,攻擊者也能顯示一些資訊如儲存在/tmp目錄內的會話資訊,這是由於這些檔案是屬於web伺服器的(nobody)。
php的安全模式確實起到了一些作用,可以認為它是一種深度防範機制。可是,它只提供了可憐的保護,同時在本專題中也沒有其它安全措施來替代它。
PHP安全程式設計
一 外部策略 1.處理使用者的提交的資料 get post request cookie argv php stdin php input file get contents 遠端的資料庫資訊 遠端api 來自客戶端的資料 以上的資料來源都很可能被作為資料來源插入到你的php指令碼中從而造成 xss...
PHP安全程式設計之留心後門URL
後門url是指雖然無需直接呼叫的資源能直接通過url訪問。例如,下面web應用可能向登入使用者顯示敏感資訊 authenticated false authenticated check auth if authenticated 由於sensitive.php位於 主目錄下,用瀏覽器能跳過驗證機制...
PHP安全程式設計之shell命令注入
使用系統命令是一項危險的操作,尤其在你試圖使用遠端資料來構造要執行的命令時更是如此。如果使用了被汙染資料,命令注入漏洞就產生了。exec 是用於執行shell命令的函式。它返回執行並返回命令輸出的最後一行,但你可以指定乙個陣列作為第二個引數,這樣輸出的每一行都會作為乙個元素存入陣列。使用方式如下 l...