php escapeshellcmd多字節編碼漏洞(2)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:詳細講解PHP中緩存技術的應用
      PHP,一門最近幾年興起的web設計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp網站,在速度上有絕對的優勢,想mssql轉6萬條數據php如需要40秒,asp不下2分鐘.但是,由于

      可以看到,php通過將",',#,&,;.....等等在shell命令行里有特殊意義的字符都通過在前面加上變成".',#,&,;......來進行轉義,使得用戶的輸入被過濾,來避免產生command injection漏洞。在php看來,只要過濾了這些字符,送入到system等函數中時,參數就會是安全的,php手冊中給出的利用例子如下:

      <?php
      $e=escapeshellcmd($userinput);
      //herewedon'tcareif$ehasspaces
      system("echo$e");
      $f=escapeshellcmd($filename);
      //andherewedo,soweusequotes
      system("touch"/tmp/$f";ls-l"/tmp/$f"");
      ?>

      很明顯,如果沒有經過escapeshellcmd的處理,用戶輸入hello;id的話,最后system執行的會是:

      echo hello;id

      ;在shell里是分割命令的作用,這樣不僅僅會echo hello,還會執行id這個命令,導致命令注入漏洞。用escapeshellcmd處理之后命令變成:

      echo hello;id

      這樣執行的命令就只會是echo,其他的都變成echo的參數,很安全。

      事實上是這樣么?php在處理完參數送入system之后它就什么都不管了,后面的工作實際上都是由linux來完成的,那么linux在處理這些參數的時候是怎么樣的呢?linux在執行命令的時候會有一些的表示工作環境的環境變量,譬如PWD代表當前的工作環境,UID代表了你的身份,BASH代表命令解釋器等等......而在linux系統執行命令的時候,還有一個非常重要的參數,LANG,這個參數決定了linux shell如何處理你的輸入,這樣就可以當你輸入一些中文字符的時候,linux能認識他,不至于出現人與系統之間出現理解上的錯誤。默認情況下,linux的LANG是en_US.UTF-8,UTF-8是一個很安全的字符集,其系列中包含有對自身的校驗,所以不會出現錯誤,會工作良好。一些系統支持多字節字符集如GBK的時候,這也正是國內的多數情況,你可以設置LANG=zh_CN.GBK,這樣你的輸入都會被當作GBK編碼處理,而GBK是雙字節的,合法的GBK編碼會被認為是一個字符。

      分享:利用PHP V5開發多任務應用程序
      許多 PHP 開發人員認為,由于標準的 PHP 缺少線程功能,因此實際 PHP 應用程序不可能執行多任務處理。例如,如果應用程序需要其他 Web 站點的信息,那么在遠程檢索完成之前它都必須停止。這是錯

      來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
      相關PHP教程