日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP CGI 中 fix_pathinfo 引起的安全隐患

發布時間:2025/5/22 php 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP CGI 中 fix_pathinfo 引起的安全隐患 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天網上開始瘋傳一個“nginx文件類型錯誤解析漏洞”,這個“漏洞”是這樣的:

假設有如下的 URL:http://phpvim.net/foo.jpg,當訪問 http://phpvim.net/foo.jpg/a.php 時,foo.jpg 將會被執行,如果 foo.jpg 是一個普通文件,那么 foo.jpg 的內容會被直接顯示出來,但是如果把一段 php 代碼保存為 foo.jpg,那么問題就來了,這段代碼就會被直接執行。這對一個 Web 應用來說,所造成的后果無疑是毀滅性的。

關于這個問題,已有高手 laruence 做過詳細的分析,這里再多啰嗦幾句。

首先不管你是否有用到正則來解析 PATH_INFO,這個漏洞都是存在的。比如下面這個最基本的 nginx 配置:

1 2 3 4 5 6 location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }

漏洞同樣會出現,如 laruence 所說,實際上這個漏洞和 nginx 真的沒什么關系,nginx 只是個 Proxy,它只負責根據用戶的配置文件,通過 fastcgi_param 指令將參數忠實地傳遞給 FastCGI Server,問題在于 FastCGI Server 如何處理 nginx 提供的參數?

比如訪問下面這個 URL:

1 [text]?view plaincopy
  • <span?style="font-size:?14px;">http://phpvim.net/foo.jpg/a.php/b.php/c.php</span>??
  • 那么根據上面給出的配置,nginx 傳遞給 FastCGI 的 SCRIPT_FILENAME 的值為:

    1 [text]?view plaincopy
  • <span?style="font-size:?14px;">/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php</span>??
  • 也就是 $_SERVER['ORIG_SCRIPT_FILENAME']。

    當 php.ini 中 cgi.fix_pathinfo = 1 時,PHP CGI 以 / 為分隔符號從后向前依次檢查如下路徑:

    1 2 3 4 [text]?view plaincopy
  • <span?style="font-size:?14px;">/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php??
  • /home/verdana/public_html/unsafe/foo.jpg/a.php/b.php??
  • /home/verdana/public_html/unsafe/foo.jpg/a.php??
  • /home/verdana/public_html/unsafe/foo.jpg</span>??
  • 直到找個某個存在的文件,如果這個文件是個非法的文件,so… 悲劇了~

    PHP 會把這個文件當成 cgi 腳本執行,并賦值路徑給 CGI 環境變量——SCRIPT_FILENAME,也就是 $_SERVER['SCRIPT_FILENAME'] 的值了。

    在很多使用 php-fpm (<0.6) 的主機中也會出現這個問題,但新的 php-fpm 的已經關閉了 cgi.fix_pathinfo,如果你查看 phpinfo() 頁面會發現這個選項已經不存在了,代碼 ini_get(“cgi.fix_pathinfo”) 的返回值也是 “false”。

    原因是似乎因為 APC 的一個 bug,當 cgi.fix_pathinfo 開啟時,PATH_TRANSLATED 有可能是 NULL,從而引起內存異常,造成 php-fpm crash,所以 php-fpm 關閉這個選項。

    Comments Off May 22nd, 2010 | Filed under?PHP Tags:?FastCGI,?Nginx,?PHP

    啟動 PHP 內置 FastCGI Server 的腳本

    前幾天把工作平臺從 Ubuntu 9.10 Karmic 更新到了 10.04 Lucid,由于 Lucid 官方源自帶了 PHP5.3.2,以前使用的?dotdeb?的源就沒法用了,一直很喜歡這個源的,不但提供了 PHP5.3 而且還有 php5-fpm 這個很實用的 fcgi 進程管理器,這個在官方源里面是沒有的。強行上了 dotdeb 雖然也可以,不過必然有很多包會出現依賴問題,處理這些依賴關系是件很煩心的事情。哥啥都不怕,就怕麻煩~?

    對于 PHP 來說,php-fpm?還是最合適的,spawn-fcgi?這類東西就不用考慮了,我寧愿用 PHP5 內置的 FastCGI Server。
    Read more…

    Comments Off Apr 30th, 2010 | Filed under?PHP Tags:?Linux,?PHP,?Shell,?Ubuntu

    [PHP] configure: warning: lemon versions supported for regeneration of libsqlite parsers: 1.0 (found: none)

    在 cygwin 中編譯 PHP 時遇到下面的問題:

    1 2 3 checking for lemon... no configure: warning: lemon versions supported for regeneration of \libsqlite parsers: 1.0 (found: none).

    解決方法:

    1 2 3 wget http://www.sqlite.org/cvstrac/getfile/sqlite/tool/lemon.c gcc -o lemon lemon.c mv lemon /usr/local/bin

    重新運行 ./configure 后,問題解決。

    Comments Off Oct 31st, 2009 | Filed under?PHP Tags:?Cygwin,?PHP

    為 PHP 文件設置默認圖標

    XP 和早期的 Windows 中,你可以通過系統新增或者修改某些類型的文件圖標,但是自 Vista 以后,這個功能就被 "Default Programs" 替代了,要修改圖標只能依賴一些第三方軟件。如果不想使用第三方軟件,則可以通過修改注冊表來手動更改文件的圖標,以下以 PHP 文件為例:

    Read more…

    1 comment May 15th, 2009 | Filed under?PHP Tags:?PHP,?Windows

    在 Nginx 中配置 Zend Framework

    1 2 3 4 5 6 7 location / {root d:/public_html;index index.php index.html index.htm;if (!-e $request_filename) {rewrite ^/(.*)$ /myproject/public/index.php last;} }

    按照配置文件,我的項目地址是:http://localhost/myproject/public,項目是部署在子目錄 /myproject/public 里面的,如果你把 document_root 直接設置為 /myproject/public,使用 http://localhost 來訪問,那么上述配置刪除掉 index.php 前面的目錄部分,也就是 rewrite ^/(.*)$ index.php last;

    Nginx 不支持 Apache 的 .htaccess 文件,所以需要在 Nginx 配置文件中編寫重寫規則。Apache 的絕大部分 RewriteRule 命令都可以不做修改的放到 Nginx 中直接使用。你只要把 RewriteRule 改成 rewrite,[L] 改成 last 之類的就可以了,具體可以看一下 Nginx 的 Rewrite 文檔。

    http://wiki.nginx.org/NginxHttpRewriteModule

    題外話,Zend Framework 越來越強大,越來越復雜了,很多追求“簡潔”的 Coder 們都已經開始信誓旦旦的說要放棄 ZF 。有點搞笑,這就好像我在說:飛機太快了,價錢太貴了,不適合我,還是自行車好啊!有些人對待問題的看法極端又片面,就好像看電視劇的時候,也總是要把人分為好人和壞人一樣,他們的想法很單純——我不喜歡 ZF,因為臃腫、復雜,所以它是垃圾。

    1 comment May 11th, 2009 | Filed under?PHP Tags:?Nginx,?PHP,?Zend

    Windows 下 Nginx + PHP5 的安裝與配置

    Nginx?是一個輕量級的高性能 Http WebServer,以事件驅動方式編寫,因此相比 Apache 而言,Nginx 更加穩定、性能更好,而且配置簡單,資源占用較低。以下是我在 Windows 7 安裝中 Nginx 和 PHP5.3 的步驟。

    安裝 PHP5

    首先,從?http://windows.php.net/download/?下載最新的 PHP 5.3 Windows 版本,這里 PHP 以 FastCGI 模式運行,所以請下載 None Thead Safe 版本。

    解壓至 C:\php5,把壓縮包中的 php.ini-recommended,更名為 php.ini,然后打開修改幾個選項:

    1 2 3 4 5 6 7 8 9 10 11 error_reporting = E_ALL display_errors = On extension_dir = "C:\php5\ext"; 動態擴展,可以根據需要去掉 extension 前面的注釋 ; ; 如加載 PDO, MySQL extension=php_pdo.dll extension=php_pdo_mysql.dll; CGI 設置 cgi.fix_pathinfo = 1

    Read more…

    14 comments May 10th, 2009 | Filed under?PHP Tags:?Nginx,?PHP,?Windows

    UTF8,PHP 以及 MySQL

    在?Akra’s DevNotes?看到的這篇文章,剛好最近兩篇文章都是將亂碼的,于是也搬過來了。

    問題:

    存儲多字節字符到 MySQL,或者從 MySQL 中讀取類似的數據,出現亂碼。

    解決方法:

    在任何地方都使用 UTF-8 編碼。

    > 瀏覽器

    1 [php]?view plaincopy
  • <span?style="font-size:?14px;"><span?style="color:?#339933;?padding:?0px;?margin:?0px;"><</span>??php?<span?style="color:?#990000;?padding:?0px;?margin:?0px;">header</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">"Content-type:?text/html;?charset=utf-8"</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>?<span?style="color:?#000000;?font-weight:?bold;?padding:?0px;?margin:?0px;">?></span></span>??
  • 或者使用一個 meta 標簽來設置HTTP協議的響應頭報文:

    1 <meta http-equiv="content-type" content="text/html; charset=utf-8" />

    這行 HTML 代碼會通知客戶端瀏覽器,文件類型為 html,且使用了 utf-8 編碼。
    header()函數所發送的 HTTP,從優先級上面看,由于先一步被瀏覽器所接受,所以優先級更高(不知道可不可以這么說)。
    Read more…

    2 comments Mar 22nd, 2009 | Filed under?PHP Tags:?Apache,?MySQL,?PHP,?Unicode,?Zend

    在 Zend_Db 中使用 UTF-8 編碼

    基本思路就是向數據庫發送 SQL “SET NAMES UTF8″,可根據不同的情況來編寫代碼。

    如:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [php]?view plaincopy
  • <span?style="font-size:?14px;"><span?style="color:?#339933;?padding:?0px;?margin:?0px;"><</span>??php??
  • <span?style="color:?#000088;?padding:?0px;?margin:?0px;">$params</span>?<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=</span>?<span?style="color:?#990000;?padding:?0px;?margin:?0px;">array</span>?<span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span>??
  • ????<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'host'</span>?????<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=></span>?<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'127.0.0.1'</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">,</span>??
  • ????<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'username'</span>?<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=></span>?<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'verdana'</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">,</span>??
  • ????<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'password'</span>?<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=></span>?<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'******'</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">,</span>??
  • ????<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'dbname'</span>???<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=></span>?<span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'phpvim'</span>??
  • <span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • ???
  • try?<span?style="color:?#009900;?padding:?0px;?margin:?0px;">{</span>??
  • ????<span?style="color:?#000088;?padding:?0px;?margin:?0px;">$db</span>?<span?style="color:?#339933;?padding:?0px;?margin:?0px;">=</span>?Zend_Db<span?style="color:?#339933;?padding:?0px;?margin:?0px;">::</span><span?style="color:?#004000;?padding:?0px;?margin:?0px;">factory</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'PDO_MYSQL'</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">,</span>?<span?style="color:?#000088;?padding:?0px;?margin:?0px;">$params</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • ????<span?style="color:?#000088;?padding:?0px;?margin:?0px;">$db</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">-></span><span?style="color:?#004000;?padding:?0px;?margin:?0px;">query</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">"SET?NAMES?UTF8"</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • ????Zend_Db_Table_Abstract<span?style="color:?#339933;?padding:?0px;?margin:?0px;">::</span><span?style="color:?#004000;?padding:?0px;?margin:?0px;">setDefaultAdapter</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#000088;?padding:?0px;?margin:?0px;">$db</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • <span?style="color:?#009900;?padding:?0px;?margin:?0px;">}</span>?catch?<span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span>Exception?<span?style="color:?#000088;?padding:?0px;?margin:?0px;">$e</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span>?<span?style="color:?#009900;?padding:?0px;?margin:?0px;">{</span>??
  • ????<span?style="color:?#990000;?padding:?0px;?margin:?0px;">exit</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#000088;?padding:?0px;?margin:?0px;">$e</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">-></span><span?style="color:?#004000;?padding:?0px;?margin:?0px;">getMessage</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • <span?style="color:?#009900;?padding:?0px;?margin:?0px;">}</span>??
  • ???
  • Zend_Registry<span?style="color:?#339933;?padding:?0px;?margin:?0px;">::</span><span?style="color:?#004000;?padding:?0px;?margin:?0px;">set</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">(</span><span?style="color:?#0000ff;?padding:?0px;?margin:?0px;">'dbAdapter'</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">,</span>?<span?style="color:?#000088;?padding:?0px;?margin:?0px;">$db</span><span?style="color:?#009900;?padding:?0px;?margin:?0px;">)</span><span?style="color:?#339933;?padding:?0px;?margin:?0px;">;</span>??
  • ???
  • <span?style="color:?#666666;?font-style:?italic;?padding:?0px;?margin:?0px;">/*?vim:?set?expandtab?tabstop=4?shiftwidth=4:?*/</span>??
  • <span?style="color:?#000000;?font-weight:?bold;?padding:?0px;?margin:?0px;">?></span></span>??
  • 這是早期的解決方法,其實并不推薦這么做,因為并不是所有頁面都需要 SQL 查詢,上述代碼放在 bootstrap 中,在不需要 SQL 連接的頁面中也會開啟一次數據庫連接并發送 SET NAMES UTF8 ,這就浪費了資源。
    Read more…

    Comments Off Mar 18th, 2009 | Filed under?PHP Tags:?PHP,?Unicode,?Zend

    Zend_Filter_Input 的亂碼問題

    Zend_Filter_Input 可以用來獲得安全可靠的用戶數據,簡單的來說這個類就像一個黑盒,原始數據輸入后,經過過濾器過濾,然后再由校驗器校驗,若通過了原先設定的過濾及校驗規則,則最后輸出可用的數據,否則給出詳細的錯誤報告。

    為了數據安全,比如轉義一些特定字符,默認情況下 Zend_Filter_Input 會使用 HtmlEntities Filter 過濾所有的數據,然而不幸的是,這個 HtmlEntities 使用默認編碼 ISO-8859-1,如果是中文等多字節語種,那么最后數據就會出現亂碼,面目全非。

    最近我在自己的項目中就遇到這個問題,其實解決方法很多,多寫幾行代碼而已,但是因為亂碼的問題由來已久,而且造成亂碼的原因也非常多,找不到問題所在,那就惱火的很了,這里簡單總結了一下。
    Read more…

    Comments Off Mar 18th, 2009 | Filed under?PHP Tags:?PHP,?Unicode,?Zend

    Xdebug 與 Apache2.2

    以前在使用 xdebug 的時候,偶有崩潰現象,但并不是太頻繁,但是自從換用 Apache2.2 以后,Apache 崩潰的頻率大幅增加,換用了不同的 PHP 和 xdebug 的版本都是一樣,不停的崩潰,正常的開發根本無法保證。

    后來無意中發現是 php5apache2_2.dll 的問題,因為我一直使用 module 模式安裝 PHP5,所以不管 PHP5 和 xdebug 換到什么版本,都沒有意義,昨天將 php5 換到 CGI 模式后,配合 xdebug 一直使用到現在,Apache2 再也沒有崩潰過。

    總結

    以上是生活随笔為你收集整理的PHP CGI 中 fix_pathinfo 引起的安全隐患的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。