編程學習網 > PHP技術 > PHP安全 > PHP安全-安全模式
2016
03-15

PHP安全-安全模式

 安全模式

  PHP的safe_mode選項的目的是為了解決本章所述的某些問題。但是,在PHP層面上去解決這類問題從架構上來看是不正確的,正如PHP手冊所述(http://php.net/features.safe-mode)。

 

  當安全模式生效時,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的安全模式確實起到了一些作用,可以認為它是一種深度防范機制。可是,它只提供了可憐的保護,同時在本章中也沒有其它安全措施來替代它。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取