這兩天網(wǎng)上開始瘋傳一個“nginx文件類型錯誤解析漏洞”,這個“漏洞”是這樣的:
假設(shè)有如下的 URL:http://phpvim.net/foo.jpg,當(dāng)訪問 http://phpvim.net/foo.jpg/a.php 時,foo.jpg 將會被執(zhí)行,如果 foo.jpg 是一個普通文件,那么 foo.jpg 的內(nèi)容會被直接顯示出來,但是如果把一段 php 代碼保存為 foo.jpg,那么問題就來了,這段代碼就會被直接執(zhí)行。這對一個 Web 應(yīng)用來說,所造成的后果無疑是毀滅性的。
關(guān)于這個問題,已有高手 laruence 做過詳細(xì)的分析,這里再多啰嗦幾句。
首先不管你是否有用到正則來解析 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;
}
漏洞同樣會出現(xiàn),如 laruence 所說,實(shí)際上這個漏洞和 nginx 真的沒什么關(guān)系,nginx 只是個 Proxy,它只負(fù)責(zé)根據(jù)用戶的配置文件,通過 fastcgi_param 指令將參數(shù)忠實(shí)地傳遞給 FastCGI Server,問題在于 FastCGI Server 如何處理 nginx 提供的參數(shù)?
比如訪問下面這個 URL:
1
[text] ?view plaincopy <span?style="font-size:?14px;">http://phpvim.net/foo.jpg/a.php/b.php/c.php</span>??
那么根據(jù)上面給出的配置,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']。
當(dāng) 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 會把這個文件當(dāng)成 cgi 腳本執(zhí)行,并賦值路徑給 CGI 環(huán)境變量——SCRIPT_FILENAME,也就是 $_SERVER['SCRIPT_FILENAME'] 的值了。
在很多使用 php-fpm (<0.6) 的主機(jī)中也會出現(xiàn)這個問題,但新的 php-fpm 的已經(jīng)關(guān)閉了 cgi.fix_pathinfo,如果你查看 phpinfo() 頁面會發(fā)現(xiàn)這個選項已經(jīng)不存在了,代碼 ini_get(“cgi.fix_pathinfo”) 的返回值也是 “false”。
原因是似乎因為 APC 的一個 bug,當(dāng) cgi.fix_pathinfo 開啟時,PATH_TRANSLATED 有可能是 NULL,從而引起內(nèi)存異常,造成 php-fpm crash,所以 php-fpm 關(guān)閉這個選項。
Comments Off May 22nd, 2010 | Filed under?PHP Tags:?FastCGI,?Nginx,?PHP
啟動 PHP 內(nèi)置 FastCGI Server 的腳本
前幾天把工作平臺從 Ubuntu 9.10 Karmic 更新到了 10.04 Lucid,由于 Lucid 官方源自帶了 PHP5.3.2,以前使用的?dotdeb?的源就沒法用了,一直很喜歡這個源的,不但提供了 PHP5.3 而且還有 php5-fpm 這個很實(shí)用的 fcgi 進(jìn)程管理器,這個在官方源里面是沒有的。強(qiáng)行上了 dotdeb 雖然也可以,不過必然有很多包會出現(xiàn)依賴問題,處理這些依賴關(guān)系是件很煩心的事情。哥啥都不怕,就怕麻煩~?
對于 PHP 來說,php-fpm?還是最合適的,spawn-fcgi?這類東西就不用考慮了,我寧愿用 PHP5 內(nèi)置的 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
重新運(yùn)行 ./configure 后,問題解決。
Comments Off Oct 31st, 2009 | Filed under?PHP Tags:?Cygwin,?PHP
為 PHP 文件設(shè)置默認(rèn)圖標(biāo)
XP 和早期的 Windows 中,你可以通過系統(tǒng)新增或者修改某些類型的文件圖標(biāo),但是自 Vista 以后,這個功能就被 "Default Programs" 替代了,要修改圖標(biāo)只能依賴一些第三方軟件。如果不想使用第三方軟件,則可以通過修改注冊表來手動更改文件的圖標(biāo),以下以 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 直接設(shè)置為 /myproject/public,使用 http://localhost 來訪問,那么上述配置刪除掉 index.php 前面的目錄部分,也就是 rewrite ^/(.*)$ index.php last;
Nginx 不支持 Apache 的 .htaccess 文件,所以需要在 Nginx 配置文件中編寫重寫規(guī)則。Apache 的絕大部分 RewriteRule 命令都可以不做修改的放到 Nginx 中直接使用。你只要把 RewriteRule 改成 rewrite,[L] 改成 last 之類的就可以了,具體可以看一下 Nginx 的 Rewrite 文檔。
http://wiki.nginx.org/NginxHttpRewriteModule
題外話,Zend Framework 越來越強(qiáng)大,越來越復(fù)雜了,很多追求“簡潔”的 Coder 們都已經(jīng)開始信誓旦旦的說要放棄 ZF 。有點(diǎn)搞笑,這就好像我在說:飛機(jī)太快了,價錢太貴了,不適合我,還是自行車好啊!有些人對待問題的看法極端又片面,就好像看電視劇的時候,也總是要把人分為好人和壞人一樣,他們的想法很單純——我不喜歡 ZF,因為臃腫、復(fù)雜,所以它是垃圾。
1 comment May 11th, 2009 | Filed under?PHP Tags:?Nginx,?PHP,?Zend
Windows 下 Nginx + PHP5 的安裝與配置
Nginx?是一個輕量級的高性能 Http WebServer,以事件驅(qū)動方式編寫,因此相比 Apache 而言,Nginx 更加穩(wěn)定、性能更好,而且配置簡單,資源占用較低。以下是我在 Windows 7 安裝中 Nginx 和 PHP5.3 的步驟。
安裝 PHP5 首先,從?http://windows.php.net/download/?下載最新的 PHP 5.3 Windows 版本,這里 PHP 以 FastCGI 模式運(yùn)行,所以請下載 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" ; 動態(tài)擴(kuò)展,可以根據(jù)需要去掉 extension 前面的注釋 ;
; 如加載 PDO, MySQL
extension = php_pdo.dll
extension = php_pdo_mysql.dll ; CGI 設(shè)置
cgi.fix_pathinfo = 1
Read more…
14 comments May 10th, 2009 | Filed under?PHP Tags:?Nginx,?PHP,?Windows
UTF8,PHP 以及 MySQL
在?Akra’s DevNotes?看到的這篇文章,剛好最近兩篇文章都是將亂碼的,于是也搬過來了。
問題: 存儲多字節(jié)字符到 MySQL,或者從 MySQL 中讀取類似的數(shù)據(jù),出現(xiàn)亂碼。
解決方法: 在任何地方都使用 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 標(biāo)簽來設(shè)置HTTP協(xié)議的響應(yīng)頭報文:
1
<meta http-equiv = "content-type" content = "text/html; charset=utf-8" / >
這行 HTML 代碼會通知客戶端瀏覽器,文件類型為 html,且使用了 utf-8 編碼。 header()函數(shù)所發(fā)送的 HTTP,從優(yōu)先級上面看,由于先一步被瀏覽器所接受,所以優(yōu)先級更高(不知道可不可以這么說)。 Read more…
2 comments Mar 22nd, 2009 | Filed under?PHP Tags:?Apache,?MySQL,?PHP,?Unicode,?Zend
在 Zend_Db 中使用 UTF-8 編碼
基本思路就是向數(shù)據(jù)庫發(fā)送 SQL “SET NAMES UTF8″,可根據(jù)不同的情況來編寫代碼。
如:
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;" > </span>?? <span?style="color:?#000000;?font-weight:?bold;?padding:?0px;?margin:?0px;" >?></span></span>??
這是早期的解決方法,其實(shí)并不推薦這么做,因為并不是所有頁面都需要 SQL 查詢,上述代碼放在 bootstrap 中,在不需要 SQL 連接的頁面中也會開啟一次數(shù)據(jù)庫連接并發(fā)送 SET NAMES UTF8 ,這就浪費(fèi)了資源。 Read more…
Comments Off Mar 18th, 2009 | Filed under?PHP Tags:?PHP,?Unicode,?Zend
Zend_Filter_Input 的亂碼問題
Zend_Filter_Input 可以用來獲得安全可靠的用戶數(shù)據(jù),簡單的來說這個類就像一個黑盒,原始數(shù)據(jù)輸入后,經(jīng)過過濾器過濾,然后再由校驗器校驗,若通過了原先設(shè)定的過濾及校驗規(guī)則,則最后輸出可用的數(shù)據(jù),否則給出詳細(xì)的錯誤報告。
為了數(shù)據(jù)安全,比如轉(zhuǎn)義一些特定字符,默認(rèn)情況下 Zend_Filter_Input 會使用 HtmlEntities Filter 過濾所有的數(shù)據(jù),然而不幸的是,這個 HtmlEntities 使用默認(rèn)編碼 ISO-8859-1,如果是中文等多字節(jié)語種,那么最后數(shù)據(jù)就會出現(xiàn)亂碼,面目全非。
最近我在自己的項目中就遇到這個問題,其實(shí)解決方法很多,多寫幾行代碼而已,但是因為亂碼的問題由來已久,而且造成亂碼的原因也非常多,找不到問題所在,那就惱火的很了,這里簡單總結(jié)了一下。 Read more…
Comments Off Mar 18th, 2009 | Filed under?PHP Tags:?PHP,?Unicode,?Zend
Xdebug 與 Apache2.2
以前在使用 xdebug 的時候,偶有崩潰現(xiàn)象,但并不是太頻繁,但是自從換用 Apache2.2 以后,Apache 崩潰的頻率大幅增加,換用了不同的 PHP 和 xdebug 的版本都是一樣,不停的崩潰,正常的開發(fā)根本無法保證。
后來無意中發(fā)現(xiàn)是 php5apache2_2.dll 的問題,因為我一直使用 module 模式安裝 PHP5,所以不管 PHP5 和 xdebug 換到什么版本,都沒有意義,昨天將 php5 換到 CGI 模式后,配合 xdebug 一直使用到現(xiàn)在,Apache2 再也沒有崩潰過。
總結(jié)
以上是生活随笔 為你收集整理的PHP CGI 中 fix_pathinfo 引起的安全隐患 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。