搜尋
首頁後端開發php教程php以CGI 模式安裝時可能遇到的攻擊及解決方法

如果不想把 PHP 嵌入伺服器端軟體(如 Apache)作為一個模組安裝的話,可以選擇以 CGI 的模式安裝。或把 PHP 用於不同的 CGI 封裝以便為程式碼建立安全的 chroot 和 setuid 環境。這種安裝方式通常會把 PHP 的執行檔安裝到 web 伺服器的 cgi-bin 目錄。儘管PHP 可以作為一個獨立的解釋器,但是它的設計使它可以防止下面類型的攻擊:

訪問系統文件:http://my.host/cgi-bin/php?/etc/passwd 在URL 請求的問號(?)後面的訊息會傳給CGI 介面作為命名行的參數。其它的解釋器會在命令列中開啟並執行第一個參數所指定的檔案。 但是,以 CGI 模式安裝的 PHP 解譯器被呼叫時,它會拒絕解釋這些參數。

訪問伺服器上的任意目錄:http://my.host/cgi-bin/php/secret/doc.html 好像上面這種情況,PHP 解釋器所在目錄後面的URL 資訊 /secret/doc.html 將會例行地傳給 CGI程序並進行解釋。通常一些 web 伺服器的會將它重新導向到頁面,如 http://my.host/secret/script.php。如果是這樣的話,某些伺服器會先檢查使用者存取 /secret 目錄的權限,然後才會建立 http://my.host/cgi-bin/php/secret/script.php 上的頁面重新導向。不幸的是,許多伺服器並沒有檢查使用者存取/secret/script.php 的權限,只檢查了 /cgi-bin/php 的權限,這樣任何能存取 /cgi-bin/php 的使用者就可以存取web 目錄下的任意文件了。 在 PHP 裡,編譯時設定選項 --enable-force-cgi-redirect 以及執行時間設定指令 doc_root 和 user_dir 都可以為伺服器上的檔案和目錄新增限制,以防止這類攻擊。以下將對各個選項的設定進行詳細講解。

情形一:只執行公開的檔案

如果 web 伺服器中所有內容都受到密碼或 IP 位址的存取限制,就不需要設定這些選項。如果 web 伺服器不支援重定向,或 web 伺服器無法和 PHP 通訊而使存取請求變得更為安全,可以在 configure 腳本中指定 --enable-force-cgi-redirect 選項。除此之外,還要確認PHP 程式不依賴其它方式調用,例如透過直接的 http://my.host/cgi-bin/php/dir/script.php 存取或透過重定向訪問 http://my .host/dir/script.php。

在Apache中,重定向可以使用 AddHandler 和 Action 語句來設定。

情形二:使用--enable-force-cgi-redirect 選項

此編譯選項可以防止任何人透過如 http://my.host/cgi-bin/php/secretdir/script.php 這樣的URL 直接呼叫PHP。 PHP 在此模式下只會解析已經通過了 web 伺服器的重定向規則的 URL。

通常 Apache 中的重定向設定可以透過以下指令完成:

Action php-script /cgi-bin/php
AddHandler php-script .php

此選項只在 Apache 下進行過測試,並且要依賴 Apache 在重定向操作中所設定的非標準 CGI 環境變數 REDIRECT_STATUS。如果 web 伺服器不支援任何方式能夠判斷請求是直接的還是重定向的,就不能使用這個選項,而應該用其它方法。

情形三:設定 doc_root 或 user_dir

在 web 伺服器的主文檔目錄中包含動態內容如腳本和可執行程式有時被認為是一種不安全的實踐。如果因為配置上的錯誤而未能執行腳本而作為普通 HTML 文件顯示,那就可能導致知識產權或密碼資料的洩露。所以很多系統管理員都會特別設定一個只能透過 PHP CGI 來存取的目錄,這樣該目錄中的內容只會被解析而不會原樣顯示出來。

對於前面所說無法判斷是否重定向的情況,很有必要在主文檔目錄之外建立一個專用於腳本的 doc_root 目錄。

可以透過設定檔內的 doc_root 或設定環境變數 PHP_DOCUMENT_ROOT 來定義 PHP 腳本主目錄。如果設定了該項,那麼 PHP 只會解釋 doc_root 目錄下的文件,並確保目錄外的腳本不會被 PHP 解釋器執行(下面所說的 user_dir 除外)。

另一個可用的選項是 user_dir。當 user_dir 沒有設定的時候,doc_root 就是唯一能控制在哪裡開啟檔案的選項。存取如 http://my.host/~user/doc.php 這個URL 時,並不會開啟使用者主目錄下文件,而只會執行doc_root 目錄下的 ~user/doc.php(這個子目錄以[ ~] 作開頭)。

如果設定了 user_dir,例如 public_php,那麼像 http://my.host/~user/doc.php 這樣的請求將會執行使用者主目錄下的 public_php 子目錄下的 doc.php 檔案。假設使用者主目錄的絕對路徑是 /home/user,那麼被執行檔將會是 /home/user/public_php/doc.php。

user_dir 的设置与 doc_root 无关,所以可以分别控制 PHP 脚本的主目录和用户目录。

情形四:PHP 解释器放在 web 目录以外

一个非常安全的做法就是把 PHP 解释器放在 web 目录外的地方,比如说 /usr/local/bin。这样做唯一不便的地方就是必须在每一个包含 PHP 代码的文件的第一行加入如下语句:

#!/usr/local/bin/php

还要将这些文件的属性改成可执行。也就是说,要像处理用 Perl 或 sh 或其它任何脚本语言写的 CGI 脚本一样,使用以 #! 开头的 shell-escape 机制来启动它们。

在这种情况下,要使 PHP 能正确处理 PATH_INFO 和 PATH_TRANSLATED 等变量的话,在编译 PHP 解释器时必须加入 --enable-discard-path 参数。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境