Rev 48 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*QBPWCF, Quick Build PHP website Component base on Fedora Linux.Copyright (C) 2015~2025 Min-Jhin,ChenThis file is part of QBPWCF.QBPWCF is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.QBPWCF is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with QBPWCF. If not, see <http://www.gnu.org/licenses/>.*/namespace qbpwcf;/*類別說明:可以取得用戶端/伺服端資訊的類別.備註:無.*/class csInformation{/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic*/public function __call($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __call end/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic*/public static function __callStatic($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __callStatic end/*#函式說明:#取得執行該php的帳戶名稱.#回傳結果:#$result,字串,運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function runner(){#函式說明:#取得用戶端的資訊,並依據需要寫入到資料表裡面#回傳的結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["mode"],當前的模式是"cmd"還是"web".#$result["userBrowserType"],爲使用者的瀏覽器資訊#$result["userIp"],爲使用者的IP#$result["serverIp"],為伺服器的IP#$result["server_name"],伺服器的 domain name#$result["scheme"],通訊協定#$result["serverPort"],伺服器給對外下載網頁的port#$result["requestUri"],爲使用者要求的網址/php檔案.#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.#$result["clientRequestIP"],用戶端要求的ip與port#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功#$result["phpUser"],運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.#$result["phpUserType"],運行該php的使用者帳戶類型,可能有"regular(no wheel member)","wheel(can use sudo)","intrinsic(root)","system(qemu,apache,...)".#$result["header"],接收到的 header 陣列.#$result["body"],接收到的 body 字串.#必填參數:#$conf["getAccount"],字串,是否要取得帳號,"true"代表要;"false"代表不要.$conf["csInformation::getConnectionInfo"]["getAccount"]="true";#可省略參數:#$conf["accountVar"],字串,帳號儲存在哪個變數裏面,預設爲$_SESSION["username"].#$conf["accountVar"]=$_SESSION["username"];#$conf["saveToDb"],字串,是否要除儲存到資料庫,"true"為要儲存",預設為"false"不儲存.#$conf["saveToDb"]="true";#$conf["dbAddress"],字串,爲mysql/mariadb server的位置,若saveToDb設為"true",則該參數為必填.#$conf["dbAddress"]=$dbAddress;#$conf["dbAccount"],字串,爲用於連入mysql/mariadb server時要使用的帳號,若saveToDb設為"true",則該參數為必填.#$conf["dbAccount"]=$dbAccount;#$conf["dbName"],字串,要選取的資料庫名稱,若saveToDb設為"true",則該參數為必填.#$conf["dbName"]=$dbName;#$conf["tableName"],字串,爲要插入資料的資料表名稱,若saveToDb設為"true",則該參數為必填.#$conf["tableName"]="visitorInfo";#$conf["columnName"],字串陣列,爲資料表的項目名稱,例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間.若saveToDb設為"true",則該參數為必填.#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");#$conf["dbPassword"],字串,爲連線到mysql/mariadb server時要使用的密碼,可省略,若省略則代表不使用密碼.#$conf["dbPassword"]=$dbPassword;#參考資料:#$_SERVER=>http://php.net/manual/zh/reserved.variables.server.php#取得伺服器名稱與IP=>http://php.net/manual/en/function.gethostname.php#備註:#無.$getConnectionInfo=csInformation::getConnectionInfo($conf["csInformation::getConnectionInfo"]);unset($conf["csInformation::getConnectionInfo"]);#如果檢查失敗if($getConnectionInfo["status"]=="false"){#設置執行失敗的識別$result["status"]="false";#設置執行失敗的訊息$result["error"]=$getConnectionInfo;#回傳結果return $result;}#if end#回傳運行該php程式的帳戶名稱return $getConnectionInfo["phpUser"];}#function runner end/*#函式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd".#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:##考慮改用php-sapi-name()來判斷.*/public static function getEnv(){#如果是在命令列環境if(!(isset($_SERVER['HTTP_USER_AGENT']))){#回傳是在 "cmd" 環境return "cmd";}#if end#反之回傳是在 "web" 環境else{return "web";}#else end}#function get Env end/*#函式說明:#取得用戶端的瀏覽器版本資訊,並回傳。#回傳結果:#$result,瀏覽器的資訊.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function getUserBrowserType(){#如果為命令列if(!isset($_SERVER['HTTP_USER_AGENT'])){#取得運行php的作業系統環境#參考資料:#http://php.net/manual/en/function.php-uname.php$userBrowser=php_uname();}#if end#反之為網頁else{#取得客戶端的瀏覽器資訊$userBrowser=$_SERVER['HTTP_USER_AGENT'];}#else end#回傳使用者的瀏覽器資訊return $userBrowser;}#function getUserBrowserType end/*#函式說明:#回傳用戶端的IP位置#回傳的結果:#$result,用戶端的ip,若在命令列下執行則回傳getServerIP()的結果.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function getClientIP(){#如果找不到 $_SERVER['REMOTE_ADDR']if(!isset($_SERVER['REMOTE_ADDR'])){#則代表是在cmd環境下執行#函式說明:#取得伺服器的IP,並回傳。#回傳的結果:#$result,伺服端的IP#備註:#伺服端必須被 localhost 以外的網址連結才會出現正確的IPreturn csInformation::getServerIP();}#if end#取得客戶端IP$clientIP = $_SERVER['REMOTE_ADDR'];#回傳使用者的IPreturn $clientIP;}#function getClientIP end/*#函式說明:#取得伺服器的IP,並回傳。#回傳的結果:#$result,伺服端的IP#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#伺服端必須被 localhost 以外的網址連結才會出現正確的IP*/public static function getServerIP(){#如果是命令列if(!isset($_SERVER['SERVER_ADDR'])){$serverIP = gethostbyname(gethostname());}#if end#反之是網頁else{#取得伺服端的IP$serverIP = $_SERVER['SERVER_ADDR'];}#else end#回傳伺服端IPreturn $serverIP;}#function getServerIP end/*#函式說明:#依據提供查詢IP服務的網站取得伺服器對外的IP.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息陣列.#$result["content"],伺服端對外的IP.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileArgu"]=__FILE__;#可省略參數:#無.#參考資料:#無.#備註:#需要有網站支援此服務.*/public static function getServerRealIP(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["skipableVariableName"]=array();#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["skipableVariableType"]=array();#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["skipableVarDefaultValue"]=array("");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查失敗if($checkResult["status"]=="false"){#設置執行失敗的識別$result["status"]="false";#設置執行失敗的訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#如果檢查不通過if($checkResult["passed"]=="false"){#設置執行失敗的識別$result["status"]="false";#設置執行失敗的訊息$result["error"]=$checkResult;#回傳結果return $result;}#if end#嘗試取得自己IP的設定檔#函式說明:#解析PHP檔案裡面的變數.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["argu"],所使用的參數.#$result["content"],找到的變數內容陣列.#$result["content"]["value"],依找到變數順序的數值.#$result["content"]["struc"],依找到變數順序的階層結構.#$result["content"]["direct"],變數名稱對應的數值內容.#必填參數:#$conf["file"],字串,檔案的路徑與名稱.$conf["fileAccess::parseVaraiableInPHPfile"]["file"]=pathinfo(__FILE__)["dirname"]."/../../../etc/qbpwcf/config.php";#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["fileAccess::parseVaraiableInPHPfile"]["fileArgu"]=$conf["fileArgu"];#$conf["varName"],字串陣列,要搜尋的變數名稱,例如要搜尋變數$email則輸入"email".$conf["fileAccess::parseVaraiableInPHPfile"]["varName"]=array("myIp","getIpUrl");#可省略參數:#$conf["web"],是要取得網路上的檔案則為"true";反之則為"false",預設為"false".$conf["fileAccess::parseVaraiableInPHPfile"]["web"]="false";#參考資料:#https://www.php.net/manual/en/function.parse-str.php#備註:#無.$parseVaraiableInPHPfile=fileAccess::parseVaraiableInPHPfile($conf["fileAccess::parseVaraiableInPHPfile"]);unset($conf["fileAccess::parseVaraiableInPHPfile"]);#如果執行失敗if($parseVaraiableInPHPfile["status"]=="false"){#設置執行失敗的識別$result["status"]="false";#設置執行失敗的訊息$result["error"]=$parseVaraiableInPHPfile;#回傳結果return $result;}#if end#如果myIp變數有設定if(isset($parseVaraiableInPHPfile["content"]["myIp"])){#如果內容不為空字串if($parseVaraiableInPHPfile["content"]["myIp"][0]!==""){#取得伺服器對外的IP$result["content"]=array($parseVaraiableInPHPfile["content"]["myIp"][0]);#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end}#if end#預設用於取得自己對外ip的服務網址$getIpUrl="https://ip.qbpwcf.org";#如果變數getIpUrl有設定if(isset($parseVaraiableInPHPfile["content"]["getIpUrl"])){#如果內容不為空字串if($parseVaraiableInPHPfile["content"]["getIpUrl"][0]!==""){#更新 getIpUrl$getIpUrl=$parseVaraiableInPHPfile["content"]["getIpUrl"][0];}#if end}#if end#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["founded"],識別網址找不找得到.#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#$result["fullContent"],取得回應的完整字串內容.#$result["cookie"],cookie檔案的位置與名稱.#$result["cmd"],執行的command.#$result["argu],使用的參數.#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$getIpUrl;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=__FILE__;#可省略參數:#$conf["header"],字串陣列,要傳送的header.#$conf["header"]=array();#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["postVar"]=array();#$conf["rawPost"]="字串",要傳送的raw post內容.#$conf["rawPost"]="";#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["urlEncode"]="false";#$conf["agent"],字串,user agent的名稱.#$conf["agent"]="";#$conf["cookie"],字串,cookie位置與檔案位置.#$conf["cookie"]="";#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".#$conf["forceNewCookie"]="";$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果檢查不通過if($curlCmd["status"]=="false"){#設置執行失敗的識別$result["status"]="false";#設置執行失敗的訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#取得伺服器對外的IP$result["content"]=$curlCmd["fullContent"];#設置執行正常$result["status"]="true";#回傳結果return $result;}#function getServerIP end/*#函式說明:#取得主機可能的ip位址#回傳的結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["content"],目前瀏覽的頁面的路徑.#必填參數:#$conf["fileArgu"],字串,__FILE__的內容.$conf["fileArgu"]=__FILE__;#可省略參數:#無.#參考資料:#無.#備註:#僅能在命令列執行.*/public static function getServerIPs(&$conf=array()){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#函式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf===null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("cmd");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("ip addr");#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("netType","netCard");#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果檢查參數失敗if($checkArguments["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查參數不通過if($checkArguments["passed"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#初始化 ip 指令不存在$ipCmdExist=false;#初始化 ifconfig 指令不存在$ifconigCmdExist=false;#檢查使用的指令是否存在#函式說明:#檢查指令是否存在#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["founded"],指令是否存在,"true"代表存在,"false"代表存在.#必填參數:#$conf["cmd"],"字串",要查詢的指令.$conf["cmd::checkCmdExist"]["cmd"]="ip";#可省略參數:#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".$conf["cmd::checkCmdExist"]["binPath"]="/usr/sbin";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["cmd::checkCmdExist"]["fileArgu"]=$conf["fileArgu"];$checkCmdExist=cmd::checkCmdExist($conf["cmd::checkCmdExist"]);unset($conf["cmd::checkCmdExist"]);#如果檢查指令是否存在失敗if($checkCmdExist["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkCmdExist;#回傳結果return $result;}#if end#如果指令存在if($checkCmdExist["founded"]==="true"){#設置 ip 指令存在$ipCmdExist=true;}#if end#如果 ip 指令不存在if(!($ipCmdExist)){#檢查 ifconfig 指令是否存在#函式說明:#檢查指令是否存在#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["founded"],指令是否存在,"true"代表存在,"false"代表存在.#必填參數:#$conf["cmd"],"字串",要查詢的指令.$conf["cmd::checkCmdExist"]["cmd"]="ifconfig";#可省略參數:#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".$conf["cmd::checkCmdExist"]["binPath"]="/usr/sbin";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["cmd::checkCmdExist"]["fileArgu"]=$conf["fileArgu"];$checkCmdExist=cmd::checkCmdExist($conf["cmd::checkCmdExist"]);unset($conf["cmd::checkCmdExist"]);#如果檢查指令是否存在失敗if($checkCmdExist["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$checkCmdExist;#回傳結果return $result;}#if end#如果指令存在if($checkCmdExist["founded"]==="true"){#設置 ip 指令存在$ifconfigCmdExist=true;}#if end}#if end#如果存在 ip 指令if($ipCmdExist){#查看 "ip addr" 指令有無 "inet" 的輸出#函數說明:#檢查指令的輸出是否含有關鍵字#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["founded"],是否找到關鍵字,"true"代表有,"false"代表沒有.#$result["content"],關鍵字所在列的輸出.#必填參數:#$conf["cmd"],字串,要執行的指令.$conf["cmd::searchOutPut"]["cmd"]="ip addr";#$conf["keyWord"],字串,要檢查是否有關鍵字.$conf["cmd::searchOutPut"]["keyWord"]="inet";#可省略參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["cmd::searchOutPut"]["fileArgu"]=$conf["fileArgu"];#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".$conf["cmd::searchOutPut"]["binPath"]="/usr/sbin";$searchOutPut=cmd::searchOutPut($conf["cmd::searchOutPut"]);unset($conf["cmd::searchOutPut"]);#如果取得指令輸出的關鍵字失敗if($searchOutPut["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$searchOutPut;#回傳結果return $result;}#if end#如果指令輸出含有關鍵字if($searchOutPut["founded"]==="true"){#解析輸出 $searchOutPut["content"]#檢查每列輸出有無 "inet " 前置字串#函式說明:#取得多個符合特定字首與字尾的字串.#回傳的結果:#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。#$result["function"],當前執行的函數名稱.#$result["returnString"],爲符合字首條件的字串陣列內容。#必填的參數:#$conf["checkString"],陣列字串,要檢查的字串們.$conf["search::getMeetConditionsStringMulti"]["checkString"]=$searchOutPut["content"];#要檢查的字串陣列#可省略參數:#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.$conf["search::getMeetConditionsStringMulti"]["frontWord"]=" inet ";#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.#$conf["search::getMeetConditionsStringMulti"]["tailWord"]="";#參考資料:#str_spilt(),可以將字串依照字母分割成一個個陣列字串。$getMeetConditionsStringMulti=search::getMeetConditionsStringMulti($conf["search::getMeetConditionsStringMulti"]);unset($conf["search::getMeetConditionsStringMulti"]);#如果搜尋失敗if($getMeetConditionsStringMulti["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getMeetConditionsStringMulti;#回傳結果return $result;}#if end#如果有符合的輸出if($getMeetConditionsStringMulti["founded"]==="true"){#用 " " 分段#函式說明:#將多個固定格式的字串分開,並回傳分開的結果#回傳的參數:#$result["status"],執行成功與否,若爲"true",代表執行成功,若爲"false"代表執失敗。#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["spiltString"][$i]["oriStr"],爲第i個字串的原始內容#$result["spiltString"][$i]["dataArray"],爲第($i+1)個字串分割後的字串陣列#$result["spiltString"][$i]["dataArray"][$j],爲第($i+1)的分割好的字串的第($j+1)段內容#$result["spiltString"][$i]["dataCounts"],爲第($i+1)個字串分割後總共分成幾段#必填的參數:#$conf["stringIn"],字串陣列,要處理的字串陣列.$conf["stringProcess::spiltMutiString"]["stringIn"]=$getMeetConditionsStringMulti["returnString"];#$conf["spiltSymbol"],字串,爲要以哪個符號作爲分割.$conf["stringProcess::spiltMutiString"]["spiltSymbol"]=" ";$spiltMutiString=stringProcess::spiltMutiString($conf["stringProcess::spiltMutiString"]);unset($conf["stringProcess::spiltMutiString"]);#如果分割字串失敗if($spiltMutiString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltMutiString;#回傳結果return $result;}#if end#針對分好的每段foreach($spiltMutiString["spiltString"] as $index => $spiltedStr){#分割第一段#函式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$spiltedStr["dataArray"][1];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]="/";#爲以哪個符號作爲分割#可省略參數:#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割字串失敗if($spiltString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果有找到分割的關鍵字if($spiltString["found"]==="true"){#取得ip$result["content"][]=$spiltString["dataArray"][0];}#if end}#foreach end}#if end}#if end}#if end#反之如果存在 ifconfig 指令else if($ifconfigCmdExist){#查看 "ifconfig" 指令有無 "inet" 的輸出#函數說明:#檢查指令的輸出是否含有關鍵字#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["founded"],是否找到關鍵字,"true"代表有,"false"代表沒有.#$result["content"],關鍵字所在列的輸出.#必填參數:#$conf["cmd"],字串,要執行的指令.$conf["cmd::searchOutPut"]["cmd"]="ifconfig";#$conf["keyWord"],字串,要檢查是否有關鍵字.$conf["cmd::searchOutPut"]["keyWord"]="inet";#可省略參數:#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["cmd::searchOutPut"]["fileArgu"]=$conf["fileArgu"];#$conf["binPath"],字串,要搜尋的路徑,預設為"/usr/bin".$conf["cmd::searchOutPut"]["binPath"]="/usr/sbin";$searchOutPut=cmd::searchOutPut($conf["cmd::searchOutPut"]);unset($conf["cmd::searchOutPut"]);#如果取得指令輸出的關鍵字失敗if($searchOutPut["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$searchOutPut;#回傳結果return $result;}#if end#如果指令輸出含有關鍵字if($searchOutPut["founded"]==="true"){#解析輸出 $searchOutPut["content"]#檢查每列輸出有無 "inet " 前置字串#函式說明:#取得多個符合特定字首與字尾的字串.#回傳的結果:#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。#$result["function"],當前執行的函數名稱.#$result["returnString"],爲符合字首條件的字串陣列內容。#必填的參數:#$conf["checkString"],陣列字串,要檢查的字串們.$conf["search::getMeetConditionsStringMulti"]["checkString"]=$searchOutPut["content"];#要檢查的字串陣列#可省略參數:#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.$conf["search::getMeetConditionsStringMulti"]["frontWord"]=" inet ";#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.#$conf["search::getMeetConditionsStringMulti"]["tailWord"]="";#參考資料:#str_spilt(),可以將字串依照字母分割成一個個陣列字串。$getMeetConditionsStringMulti=search::getMeetConditionsStringMulti($conf["search::getMeetConditionsStringMulti"]);unset($conf["search::getMeetConditionsStringMulti"]);#如果搜尋失敗if($getMeetConditionsStringMulti["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getMeetConditionsStringMulti;#回傳結果return $result;}#if end#如果有符合的輸出if($getMeetConditionsStringMulti["founded"]==="true"){#用 " " 分段#函式說明:#將多個固定格式的字串分開,並回傳分開的結果#回傳的參數:#$result["status"],執行成功與否,若爲"true",代表執行成功,若爲"false"代表執失敗。#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["spiltString"][$i]["oriStr"],爲第i個字串的原始內容#$result["spiltString"][$i]["dataArray"],爲第($i+1)個字串分割後的字串陣列#$result["spiltString"][$i]["dataArray"][$j],爲第($i+1)的分割好的字串的第($j+1)段內容#$result["spiltString"][$i]["dataCounts"],爲第($i+1)個字串分割後總共分成幾段#必填的參數:#$conf["stringIn"],字串陣列,要處理的字串陣列.$conf["stringProcess::spiltMutiString"]["stringIn"]=$getMeetConditionsStringMulti["returnString"];#$conf["spiltSymbol"],字串,爲要以哪個符號作爲分割.$conf["stringProcess::spiltMutiString"]["spiltSymbol"]=" ";$spiltMutiString=stringProcess::spiltMutiString($conf["stringProcess::spiltMutiString"]);unset($conf["stringProcess::spiltMutiString"]);#如果分割字串失敗if($spiltMutiString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltMutiString;#回傳結果return $result;}#if end#針對分好的每段foreach($spiltMutiString["spiltString"] as $spiltedStr){#取得ip$result["content"][]=$spiltedStr["dataArray"][1];}#foreach end}#if end}#if end}#if end#查詢對外ip#函式說明:#依據提供查詢IP服務的網站取得伺服器對外的IP.#回傳的結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息陣列.#$result["content"],伺服端對外的IP.#必填參數:#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑$conf["self::getServerRealIP"]["fileArgu"]=$conf["fileArgu"];$getServerRealIP=self::getServerRealIP($conf["self::getServerRealIP"]);unset($conf["self::getServerRealIP"]);#如果查詢對外 ip 失敗if($getServerRealIP["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getServerRealIP;#回傳結果return $result;}#if end#取得對外ip$result["content"][]=$getServerRealIP["content"];#剔除重複的ip$result["content"]=array_unique($result["content"]);#如果是 ip addr | grep inet 則會輸出類似的內容/*inet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostinet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s5inet6 fec0::d17d:1504:b561:1535/64 scope site noprefixroute dynamicinet6 fe80::c85c:f113:e76c:4e2/64 scope linkinet 169.254.196.9/16 brd 169.254.255.255 scope link enp0s6inet6 fe80::8e5f:c35f:952b:3fd1/64 scope linkinet 192.168.200.111/24 brd 192.168.200.255 scope global dynamic enp0s7inet6 fe80::ad8d:d224:e78c:f89d/64 scope linkinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0*/#如果是 ifconfig | grep inet 則會輸出類似的內容/*inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255inet6 fe80::c85c:f113:e76c:4e2 prefixlen 64 scopeid 0x20<link>inet6 fec0::d17d:1504:b561:1535 prefixlen 64 scopeid 0x40<site>inet 169.254.196.9 netmask 255.255.0.0 broadcast 169.254.255.255inet6 fe80::8e5f:c35f:952b:3fd1 prefixlen 64 scopeid 0x20<link>inet 192.168.200.111 netmask 255.255.255.0 broadcast 192.168.200.255inet6 fe80::ad8d:d224:e78c:f89d prefixlen 64 scopeid 0x20<link>inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255*/#設置執行正常$result["status"]="true";#回傳節果return $result;}#function getServerIps end/*#函式說明:#取得目前瀏覽的頁面的路徑或執行的php程式路徑.#回傳結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["content"],目前瀏覽的頁面的路徑或執行的php程式路徑.#$result["serverIp"],取得伺服器ip.#$result["scheme"],取得與伺服器連線所使用的通訊協定,若不適用則為null.#必填參數:$conf["type"]="";#想要取得的路徑類型,"full"代表完整路徑,"pathOnly"代表只要路徑,"lastLayer"代表上一層目錄的名稱#必填參數:#無.#可省略參數:#無.#參考資料:#http://blog.longwin.com.tw/2009/01/php-get-directory-file-path-dirname-2008/#備註:#無.*/public static function getPathOfThisPhpFile($conf){#初始化要回傳的結果$result=array();#取得當前執行的函數$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#函式說明:#取得用戶端的資訊,並依據需要寫入到資料表裡面#回傳的結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["mode"],當前的模式是"cmd"還是"web".#$result["userBrowserType"],爲使用者的瀏覽器資訊#$result["userIp"],爲使用者的IP#$result["serverIp"],為伺服器的IP#$result["server_name"],伺服器的 domain name#$result["scheme"],通訊協定#$result["serverPort"],伺服器給對外下載網頁的port#$result["requestUri"],爲使用者要求的網址/php檔案.#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.#$result["clientRequestIP"],用戶端要求的ip與port#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功#$result["phpUser"],運行該php的使用者帳戶.#$result["header"],接收到的 header 陣列.#$result["body"],接收到的 body 字串.#必填的參數:$conf["csInformation::getConnectionInfo"]["getAccount"]="true";#是否要取得帳號#可省略的參數:#$conf["accountVar"]=$_SESSION["username"];#帳號儲存在哪個變數裏面,預設爲$_SESSION["username"]#$conf["saveToDb"]="true";#是否要除儲存到資料庫,"true"為要儲存",預設為不儲存#$conf["dbAddress"]=$dbAddress;;#爲mysql-Server的位置,若#$conf["saveToDb"]設為"true",則該參數為必填。#$conf["dbAccount"]=$dbAccount;#爲用於連入mysql-Server時要使用的帳號,若#$conf["saveToDb"]設為"true",則該參數為必填。#$conf["dbName"]=$dbName;#要選取的資料庫名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。#$conf["tableName"]="visitorInfo";#爲要插入資料的資料表名稱,若#$conf["saveToDb"]設為"true",則該參數為必填。#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");#爲資料表的項目名稱,#例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);#寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間#$conf["saveToDb"]設為"true",則該參數為必填。#$conf["dbPassword"]=$dbPassword;#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼$getConnectionInfo=csInformation::getConnectionInfo($conf["csInformation::getConnectionInfo"]);unset($conf["csInformation::getConnectionInfo"]);#debug#var_dump(__LINE__,$getConnectionInfo);#取得連線資訊失敗if($getConnectionInfo["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getConnectionInfo;#回傳結果return $result;}#if end#取得伺服器ip$result["serverIp"]=$getConnectionInfo["serverIp"];#取得與伺服器連線所使用的通訊協定$result["scheme"]=$getConnectionInfo["scheme"];#判斷 $conf["type"]switch($conf["type"]){#如果是 "full"case "full":#取得目前檔案的完整路徑$result["content"]=$getConnectionInfo["requestUri"];#設置執行正常$result["status"]="true";#回傳結果return $result;#打斷switchbreak;#如果是 "pathOnly"case "pathOnly":#如果是網頁環境if($getConnectionInfo["mode"]==="web"){#用 當前檔案的名稱 來分割目前檔案的完整路徑#函式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳的參數:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$getConnectionInfo["requestUri"];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=basename(($getConnectionInfo["requestUri"]));#爲以哪個符號作爲分割$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果分割失敗if($spiltString["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果分割出來少於一段if($spiltString["dataCounts"]<1){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#取得不包含檔案名稱的路徑$result["content"]=$spiltString["dataArray"][0];#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end#反之如果是 cmd 環境else if($getConnectionInfo["mode"]==="cmd"){#函式說明:#將字串特定關鍵字與其後面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#$result["argu"],使用的參數.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$getConnectionInfo["requestUriFull"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=$getConnectionInfo["requestUri"];#可省略參數:#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].$conf["stringProcess::delStrAfterKeyWord"]["deleteLastRepeatedOne"]="true";#參考資料:#無.#備註:#無.$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);unset($conf["stringProcess::delStrAfterKeyWord"]);#如果執行失敗if($delStrAfterKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrAfterKeyWord;#回傳結果return $result;}#if end#如果沒有應該要有的檔案名稱if($delStrAfterKeyWord["founded"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrAfterKeyWord;#回傳結果return $result;}#if end#取得不包含檔案名稱的路徑$result["content"]=$delStrAfterKeyWord["content"];#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end#打斷switchbreak;#如果是 "lastLayer"case "lastLayer":#如果是網頁環境if($result["mode"]==="web"){#取得上層目錄的名稱$result["content"]=basename((dirname($getConnectionInfo["requestUri"])));}#if end#反之如果是 cmd 環境else if($result["mode"]==="cmd"){#取得callback用的參數$conf["csInformation::getPathOfThisPhpFile"]=$confForCallback;#改取得路徑就好$conf["csInformation::getPathOfThisPhpFile"]["type"]="pathOnly";/*#函式說明:#取得目前瀏覽的頁面的路徑或執行的php程式路徑.#回傳結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["content"],目前瀏覽的頁面的路徑或執行的php程式路徑.#$result["serverIp"],取得伺服器ip.#$result["scheme"],取得與伺服器連線所使用的通訊協定.#必填參數:$conf["type"]="";#想要取得的路徑類型,"full"代表完整路徑,"pathOnly"代表只要路徑,"lastLayer"代表上一層目錄的名稱#必填參數:#無.#可省略參數:#無.#參考資料:#http://blog.longwin.com.tw/2009/01/php-get-directory-file-path-dirname-2008/#備註:#無.*/$getPathOfThisPhpFile=csInformation::getPathOfThisPhpFile($conf["csInformation::getPathOfThisPhpFile"]);unset($conf["csInformation::getPathOfThisPhpFile"]);#如果執行失敗if($getPathOfThisPhpFile["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getPathOfThisPhpFile;#回傳結果return $result;}#if end#取得路徑#$getPathOfThisPhpFile["content"];#函式說明:#將固定格式的字串分開,並回傳分開的結果.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::spiltString"]["stringIn"]=$getPathOfThisPhpFile["content"];#$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.$conf["stringProcess::spiltString"]["spiltSymbol"]="/";#可省略參數:#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";#參考資料:#無.#備註:#無.$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果執行失敗if($spiltString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果沒有"/"存在if($spiltString["found"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果沒有分出結果if($spiltString["dataCounts"]===0){#設置上層目錄的名稱為"/"$result["content"]="/";#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end#反之else{#取得上層目錄的索引$lastLayerIndex=$spiltString["dataCounts"]-1;#取得上層目錄$result["content"]=$spiltString["dataArray"][$lastLayerIndex];#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end}#if end#反之為異常結果else{#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"][]="無法判別環境為web還是cmd";#設置錯誤訊息$result["error"][]=$getConnectionInfo;#回傳結果return $result;}#else end#設置執行正常$result["status"]="true";#回傳結果return $result;#打斷switchbreak;#如果不是以上兩個內容default :#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf[\"type\"]變數須為「full」或「pathOnly」或「lastLayer」";#回傳結果return $result;}#switch end#不應該執行到這邊#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="不應該出現的例外狀況";#回傳結果return $result;}#getFullPathOfThisPhpFile end/*#函式說明:#取得用戶端的資訊,並依據需要寫入到資料表裡面#回傳的結果:#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.#$result["error"],錯誤訊息.#$result["function"],檔前執行的函數名稱.#$result["mode"],當前的模式是"cmd"還是"web".#$result["userBrowserType"],爲使用者的瀏覽器資訊#$result["userIp"],爲使用者的IP#$result["serverIp"],為伺服器的IP#$result["server_name"],伺服器的 domain name#$result["scheme"],通訊協定#$result["serverPort"],伺服器給對外下載網頁的port#$result["requestUri"],爲使用者要求的網址/php檔案.#$result["requestUriFull"],為使用者要求的完整網址/php檔案路徑.#$result["clientRequestIP"],用戶端要求的ip與port#$result["username"],爲使用者目前的帳戶,若爲""則表示尚未登入成功#$result["phpUser"],運行該php的使用者帳戶.若為空字串則代表非使用者直接觸發.#$result["phpUserType"],運行該php的使用者帳戶類型,可能有"regular(no wheel member)","wheel(can use sudo)","intrinsic(root)","system(qemu,apache,...)".#$result["header"],接收到的 header 陣列.#$result["body"],接收到的 body 字串.#必填參數:#$conf["getAccount"],字串,是否要取得帳號,"true"代表要;"false"代表不要.$conf["getAccount"]="true";#可省略參數:#$conf["accountVar"],字串,帳號儲存在哪個變數裏面,預設爲$_SESSION["username"].#$conf["accountVar"]=$_SESSION["username"];#$conf["saveToDb"],字串,是否要除儲存到資料庫,"true"為要儲存",預設為"false"不儲存.#$conf["saveToDb"]="true";#$conf["dbAddress"],字串,爲mysql/mariadb server的位置,若saveToDb設為"true",則該參數為必填.#$conf["dbAddress"]=$dbAddress;#$conf["dbAccount"],字串,爲用於連入mysql/mariadb server時要使用的帳號,若saveToDb設為"true",則該參數為必填.#$conf["dbAccount"]=$dbAccount;#$conf["dbName"],字串,要選取的資料庫名稱,若saveToDb設為"true",則該參數為必填.#$conf["dbName"]=$dbName;#$conf["tableName"],字串,爲要插入資料的資料表名稱,若saveToDb設為"true",則該參數為必填.#$conf["tableName"]="visitorInfo";#$conf["columnName"],字串陣列,爲資料表的項目名稱,例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);寫入的資料依序為,使用者帳戶、瀏覽器資訊、使用者IP、觀看的網址、當時的時間.若saveToDb設為"true",則該參數為必填.#$conf["columnName"]=array("username","userWebBrowser","userIp","requestUri","systemDateAndTime");#$conf["dbPassword"],字串,爲連線到mysql/mariadb server時要使用的密碼,可省略,若省略則代表不使用密碼.#$conf["dbPassword"]=$dbPassword;#參考資料:#$_SERVER=>http://php.net/manual/zh/reserved.variables.server.php#取得伺服器名稱與IP=>http://php.net/manual/en/function.gethostname.php#備註:#無.*/public static function getConnectionInfo(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數$result["function"]=__FUNCTION__;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#如果 $conf["getAccount"] 沒有設定if(!isset($conf["getAccount"])){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf[\"getAccount\"]參數尚未設定!";#回傳結果return $result;}#if end#如果 $conf["accountVar"] 沒有設定if(!isset($conf["accountVar"])){#則依照預設#如果預設的變數不存在if(!isset($_SESSION["username"])){#給與空字串$result["username"]="";}#if end#反之存在else{#取得預設值$result["username"]=$_SESSION["username"];}#else end}#if end#反之有設定else{#取得帳戶$result["username"]=$conf["accountVar"];}#else end#預設使用該php程式的使用者帳號$result["phpUser"]="apache";#嘗試從系統變數取得使用者名稱#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="env";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.#$conf["external::callShell"]["argu"]=array();#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行失敗if($callShell["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#函式說明:#檢查多個字串中的每個字串是否有多個關鍵字#回傳結果:#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息.#$result["argu"],使用的參數.#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.#$result["foundedKeyWords"],找到的關鍵字陣列.#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.#$result["keyWordsIncludeStr"],陣列,儲存有找到關鍵字的來源的索引(sourceIndex)與其內容(sourceVal)跟找到的關鍵字項目陣列(KeyWords).#必填參數:#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("LOGNAME=","USERNAME=","USER=","HOME=");#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];#可省略參數:#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.#$conf["completeEqual"]="true";#參考資料:#無.#備註:#無.$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);unset($conf["search::findManyKeyWordsFromManyString"]);#debug#var_dump(__LINE__,$findManyKeyWordsFromManyString);#如果執行不正常if($findManyKeyWordsFromManyString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#針對每個有找到關鍵字的來源字串foreach($findManyKeyWordsFromManyString["keyWordsIncludeStr"] as $keyWordsIncludeStr){#如果有多個關鍵字if(count($keyWordsIncludeStr["keyWords"])>1){#跳過continue;}#if end#解析使用者名稱#函式說明:#將字串特定關鍵字與其前面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$keyWordsIncludeStr["sourceVal"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]=$keyWordsIncludeStr["keyWords"][0];#可省略參數:#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.#$conf["lastResult"]=$delStrBeforeKeyWord;#參考資料:#無.#備註:#無.$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);unset($conf["stringProcess::delStrBeforeKeyWord"]);#debug#var_dump(__LINE__,$delStrBeforeKeyWord);#如果執行不正常if($delStrBeforeKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果沒有關鍵字if($delStrBeforeKeyWord["founded"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果不是空字串if(!empty($delStrBeforeKeyWord["content"])){#取得使用者名稱$result["phpUser"]=basename($delStrBeforeKeyWord["content"]);#結束 foreachbreak;}#if end}#foreach end#如果 $_SERVER['HTTP_USER_AGENT'] 存在if(isset($_SERVER['HTTP_USER_AGENT'])){#var_dump($_SERVER["DOCUMENT_ROOT"]);#設置為web模式$result["mode"]="web";#函式說明:#取得用戶端的瀏覽器版本資訊,並回傳。#回傳結果:#$result,瀏覽器的資訊$result["userBrowserType"]=csInformation::getUserBrowserType();#函式說明:#回傳用戶端的IP位置#回傳的結果:#$result,用戶端的ip$result["userIp"]=csInformation::getClientIP();#函式說明:#取得伺服器的IP,並回傳。#回傳的結果:#$result,伺服端的IP#備註:#伺服端必須被 localhost 以外的網址連結才會出現正確的IP$result["serverIp"]=csInformation::getServerIP();#取得通訊協定$result["scheme"]=$_SERVER["REQUEST_SCHEME"];#取得伺服器給對外下載網頁的port$result["serverPort"]=$_SERVER["SERVER_PORT"];#取得目前要求執行的網址爲$result["requestUri"]=$_SERVER["REQUEST_URI"];#如果沒有 $_SERVER["HTTP_HOST"] 存在if(!isset($_SERVER["HTTP_HOST"])){#用server端的資訊來組用戶端要求的IP與port$result["clientRequestIP"]=$result["serverIp"].":".$result["serverPort"];}#if end#反之else{#用戶端要求的IP與port$result["clientRequestIP"]=$_SERVER["HTTP_HOST"];}#else end#$_SERVER['CONTEXT_PREFIX'], 例如 "/~qbpwcf"#$result["CONTEXT_PREFIX"]=$_SERVER['CONTEXT_PREFIX'];#取得目前的系統時間#函式說明:#取得系統時間目前的西元年、月、日、時、分、秒#回傳的結果:#$result["thisWestYear"],當前西元年#$result["thisMonth"],當前月份#$result["thisDay"],當前日#$result["thisHour"],當前小時#$result["thisMin"],當前分鐘#$result["thisSec"],當前秒數#必填的參數$conf["time"]["getSystemDateAndTime"]["timeZone"]="Asia/Taipei";#時區代號,可以設定的時區列表:http://www.php.net/manual/en/timezones.php$systemDateAndTime=time::getSystemDateAndTime($conf["time"]["getSystemDateAndTime"]);unset($conf["time"]["getSystemDateAndTime"]);#設置 systemDateAndTime$result["systemDateAndTime"]=$systemDateAndTime["thisWestYear"].":".$systemDateAndTime["thisMonth"].":".$systemDateAndTime["thisDay"]." ".$systemDateAndTime["thisHour"].":".$systemDateAndTime["thisMin"].":".$systemDateAndTime["thisSec"];#如果有設置 $conf["saveToDb"]if(isset($conf["saveToDb"])){#如果 $conf["saveToDb"] 為 "true"if($conf["saveToDb"]=="true"){#將連線的資訊記錄到資料庫#函式說明:#插入資料到指定的資料表裡面,插入資料完畢可以選擇是否要進行轉址。#回傳的數值:#$result["status"],爲查詢是否成功,若爲"true"則成功,若爲"false"則表示失敗了.#$result["error"],錯誤訊息.#$result["sql"],執行的sql語法.#$result["function"],當前執行的涵式#必填的參數:$conf["db"]["insertDataToDbBest"]["dbAddress"]=$conf["dbAddress"];#爲mysql-Server的位置$conf["db"]["insertDataToDbBest"]["dbAccount"]=$conf["dbAccount"];#爲用於連入mysql-Server時要使用的帳號$conf["db"]["insertDataToDbBest"]["selectedDataBaseName"]=$conf["dbName"];#要選取的資料庫名稱$conf["db"]["insertDataToDbBest"]["tableName"]=$conf["tableName"];#爲要插入資料的資料表名稱$conf["db"]["insertDataToDbBest"]["columnName"]=$conf["columnName"];#爲資料表的項目名稱,#例如:$conf["columnName"]=array("columnName1","columnName2","columnName3",...);$conf["db"]["insertDataToDbBest"]["insertValue"]=array($result["username"],$result["userBrowserType"],$result["userIp"],$result["requestUri"],$result["systemDateAndTime"]);#爲要插入度數值,#例如:$conf["insertValue"]=array("insertValue1","insertValue2","insertValue3",...);#可以省略的變數:#如果有設置資料庫連線密碼if(isset($conf["dbPassword"])){#則套用設定$conf["db"]["insertDataToDbBest"]["dbPassword"]=$conf["dbPassword"];#爲連線到mysql-Server時要使用的密碼,可省略,若省略則代表不使用密碼#var_dump($conf["db"]["insertDataToDbBest"]["dbPassword"]);}#if end$insertData=db::insertData($conf["db"]["insertDataToDbBest"]);unset($conf["db"]["insertDataToDbBest"]);#如果寫入到資料表失敗if($insertData["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$insertData;#回傳結果return $result;}#if end}#if end}#if end#設置伺服器的 domain name$result["server_name"]=$_SERVER["SERVER_NAME"];#設置用戶端要求的完整網址$result["requestUriFull"]=$result["scheme"]."://".$result["server_name"].$result["requestUri"];}#if end#反之代表是在command模式下else{#預設為空字串,代表非使用者直接觸發$result["phpUser"]="";#如果有 LOGNAME 存在if(isset($_SERVER["LOGNAME"])){#取得使用該php程式的使用者帳號$result["phpUser"]=$_SERVER["LOGNAME"];}#if end#反之else{/*LOGNAME=liveuserUSERNAME=liveuserUSER=liveuser*/#嘗試從系統變數取得使用者名稱#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="env";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.#$conf["external::callShell"]["argu"]=array();#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行失敗if($callShell["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#函式說明:#檢查多個字串中的每個字串是否有多個關鍵字#回傳結果:#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息.#$result["argu"],使用的參數.#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.#$result["foundedKeyWords"],找到的關鍵字陣列.#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.#$result["keyWordsIncludeStr"],陣列,儲存有找到關鍵字的來源的索引(sourceIndex)與其內容(sourceVal)跟找到的關鍵字項目陣列(KeyWords).#必填參數:#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("LOGNAME=","USERNAME=","USER=","HOME=");#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];#可省略參數:#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.#$conf["completeEqual"]="true";#參考資料:#無.#備註:#無.$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);unset($conf["search::findManyKeyWordsFromManyString"]);#debug#var_dump(__LINE__,$findManyKeyWordsFromManyString);#如果執行不正常if($findManyKeyWordsFromManyString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#針對每個有找到關鍵字的來源字串foreach($findManyKeyWordsFromManyString["keyWordsIncludeStr"] as $keyWordsIncludeStr){#如果有多個關鍵字if(count($keyWordsIncludeStr["keyWords"])>1){#跳過continue;}#if end#解析使用者名稱#函式說明:#將字串特定關鍵字與其前面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$keyWordsIncludeStr["sourceVal"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]=$keyWordsIncludeStr["keyWords"][0];#可省略參數:#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.#$conf["lastResult"]=$delStrBeforeKeyWord;#參考資料:#無.#備註:#無.$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);unset($conf["stringProcess::delStrBeforeKeyWord"]);#debug#var_dump(__LINE__,$delStrBeforeKeyWord);#如果執行不正常if($delStrBeforeKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果沒有關鍵字if($delStrBeforeKeyWord["founded"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果不是空字串if(!empty($delStrBeforeKeyWord["content"])){#取得使用者名稱$result["phpUser"]=basename($delStrBeforeKeyWord["content"]);#結束 foreachbreak;}#if end}#foreach end#debug#var_dump(__LINE__,$result);}#else#預設的使用者類型為 "regular"$result["phpUserType"]="regular";#判斷使用者是否為管理者賬戶 - start#如果有抓到使用者名稱if(!empty($result["phpUser"])){#如果是 root 賬號if($result["phpUser"]==="root"){#設置 phpUserType 為 intrinsic$result["phpUserType"]="intrinsic";}#if end#反之else{#函式說明:#呼叫shell執行系統命令,並取得回傳的內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["cmd"],執行的指令內容.#$result["fullCmd"],如果參數 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["output"],爲執行完二元碼後的輸出陣列,若 $conf["inBackGround"] 為 "true",則為當下的輸出.#$result["tmpFileOutput"],儲存輸出的暫存檔案名稱,若 $conf["inBackGround"] 為 "true" 則會回傳該值.#$result["running"],是否還在執行.#$result["pid"],pid.#$result["statusCode"],執行結束後的代碼.#$result["escape"],陣列,儲存重新排序過且已經escape過的指令(key為"cmd")與參數(key為"argu")與兩者組合的一維陣列(key為"array").#必填參數:#$conf["command"],字串,要執行的指令.$conf["external::callShell"]["command"]="userdbctl";#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["external::callShell"]["fileArgu"]=__FILE__;#可省略參數:#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.$conf["external::callShell"]["argu"]=array("user",$result["phpUser"]);#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").#$conf["arguIsAddr"]=array();#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".#$conf["enablePrintDescription"]="true";#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容加上使用的$conf["argu"]參數.#$conf["printDescription"]="";#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".如果參數為"< 、<< 、> 、>> 、| 、2>&1"之一則不會過濾.$conf["external::callShell"]["escapeshellarg"]="true";#$conf["thereIsShellVar"],陣列字串,指令搭配的參數"argu",若含有「\'」,則取代為「"」.每個argu參數都要有對應的元素."true"代表要置換.#$conf["thereIsShellVar"]=array();#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.#$conf["username"]="";#$conf["password"],字串,root的使用者密碼,預設不使用密碼,該參數不適用於apache環境.#$conf["password"]="";#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".#$conf["useScript"]="";#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.#$conf["inBackGround"]="";#$conf["getErr"],字串,"true"代表將錯誤輸出變成標準輸出,反之"false"為不變動.#$conf["getErr"]="false";#$conf["doNotRun"],字串,"true"代表不執行指令,預設為"false"會執行指令.#$conf["doNotRun"]="false";#參考資料:#exec=>http://php.net/manual/en/function.exec.php#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php#備註:#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.$callShell=external::callShell($conf["external::callShell"]);unset($conf["external::callShell"]);#如果執行失敗if($callShell["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$callShell;#回傳結果return $result;}#if end#範例輸出# User name: liveuser# Disposition: regular# Last Passw.: Fri 2023-09-22 08:00:00 CST# Login OK: yes# Password OK: yes# UID: 1000# GID: 1000 (liveuser)# Aux. Groups: wheel# apache# svn# Directory: /var/home/liveuser# Storage: classic# Shell: /bin/bash# Passwd Chg.: max 273y 9month 1w 4d 19h 30min/warn 1w#Pas. Ch. Now: no# Passwords: 1# Service: io.systemd.NameServiceSwitch#DISPOSITION 為 intrinsic 者代表為系統賬戶 root#DISPOSITION 為 system 者代表為系統賬戶#DISPOSITION 為 regular 者代表為一般賬戶#一般賬戶的 Aux. Groups 清單若有 wheel 存在,則代表要透過sudo來執行給予系統賬戶權限#函式說明:#檢查多個字串中的每個字串是否有多個關鍵字#回傳結果:#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息.#$result["argu"],使用的參數.#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.#$result["foundedKeyWords"],找到的關鍵字陣列.#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.#必填參數:#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("Disposition: ");#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];#可省略參數:#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";#參考資料:#無.#備註:#無.$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);unset($conf["search::findManyKeyWordsFromManyString"]);#如果執行失敗if($findManyKeyWordsFromManyString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#如果沒有關鍵字if($findManyKeyWordsFromManyString["foundedAll"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#針對每個找到的結果foreach($findManyKeyWordsFromManyString["foundedTrueKey"] as $strWithKeyWord){#函式說明:#將字串特定關鍵字與其前面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$strWithKeyWord;#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="Disposition: ";#可省略參數:#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.#$conf["recursive"]="true";#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.#$conf["lastResult"]=$delStrBeforeKeyWord;#參考資料:#無.#備註:#無.$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);unset($conf["stringProcess::delStrBeforeKeyWord"]);#如果執行失敗if($delStrBeforeKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果應該要存在的關鍵字不存在if($delStrBeforeKeyWord["founded"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#判斷賬戶類型switch($delStrBeforeKeyWord["content"]){#若是 rootcase "intrinsic":break;#若是系統賬戶case "system";break;#若是一般使用者case "regular";#函式說明:#檢查多個字串中的每個字串是否有多個關鍵字#回傳結果:#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息.#$result["argu"],使用的參數.#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.#$result["foundedKeyWords"],找到的關鍵字陣列.#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.#必填參數:#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array("Aux. Groups: ");#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$callShell["output"];#可省略參數:#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";#參考資料:#無.#備註:#無.$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);unset($conf["search::findManyKeyWordsFromManyString"]);#如果執行失敗if($findManyKeyWordsFromManyString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#初始化執行者所屬的群組$groups=array();#如果沒有關鍵字if($findManyKeyWordsFromManyString["foundedAll"]==="false"){#代表使用者所屬的群組只有自己$groups[]=$result["phpUser"];}#if end#反之,代表屬於多個群組.else{#針對每個找到的結果foreach($findManyKeyWordsFromManyString["foundedTrueKey"] as $groupStartIndex=>$strWithKeyWord){#函式說明:#將字串特定關鍵字與其前面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$strWithKeyWord;#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="Aux. Groups: ";#可省略參數:#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.#$conf["recursive"]="true";#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則會改回傳該內容.#$conf["lastResult"]=$delStrBeforeKeyWord;#參考資料:#無.#備註:#無.$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);unset($conf["stringProcess::delStrBeforeKeyWord"]);#如果執行失敗if($delStrBeforeKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#如果應該要存在的關鍵字不存在if($delStrBeforeKeyWord["founded"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$delStrBeforeKeyWord;#回傳結果return $result;}#if end#設置該用戶屬的群組之一$groups[]=$delStrBeforeKeyWord["content"];#取得群組資訊之後的陣列內容#函式說明:#將陣列進行切割#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"]["get"],切割出來的陣列.#$result["content"]["leftL"],遺留下來的陣列,左邊.#$result["content"]["leftR"],遺留下來的陣列,右邊.#$result["content"]["ori"],原始的陣列.#$result["argu"],使用的參數.#必填參數:#$conf["array"],要進行分割的陣列.$conf["arrays::split"]["array"]=$callShell["output"];#$conf["length"],整數,要切幾個元素.$conf["arrays::split"]["length"]=0;#可省略參數:#$conf["offset"],整數,要從第幾個元素開始切,預設為0$conf["arrays::split"]["offset"]=$groupStartIndex;#參考資料:#無.#備註:#無.$split=arrays::split($conf["arrays::split"]);unset($conf["arrays::split"]);#如果執行失敗if($split["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$split;#回傳結果return $result;}#if end#可能為第1個外的群組資訊陣列#$split["content"]["leftR"];#函式說明:#檢查多個字串中的每個字串是否有多個關鍵字#回傳結果:#$result["status"],整體來說,執行是否成功,"true"代表執行成功,"false"代表執行失敗。#$result["function"],當前執行的函數名稱.#$result["error"],錯誤訊息.#$result["argu"],使用的參數.#$result["foundedTrueKey"],結果為"true"的被搜尋元素key陣列,與其數值內容.#$result["foundedKeyWords"],找到的關鍵字陣列.#$result["foundedFalseKey"],結果為"false"的被搜尋元素key陣列,與其數值內容.#$result["foundedTrueKeyWords"],二維陣列,各個字串有找到的關鍵字陣列.#$result["foundedAll"],是否每個關鍵字都有找到,"true"代表每個都有找到,"false"代表沒有每個都找到.#必填參數:#$conf["keyWords"],字串陣列,想要搜尋的關鍵字.$conf["search::findManyKeyWordsFromManyString"]["keyWords"]=array(":");#$conf["stringArray"],字串陣列,要被搜尋的字串內容陣列.$conf["search::findManyKeyWordsFromManyString"]["stringArray"]=$split["content"]["leftR"];#可省略參數:#$conf["completeEqual"],字串,是否內容要完全符合,不能多出任何不符合的內容,預設為"false"不需要完全符合.$conf["search::findManyKeyWordsFromManyString"]["completeEqual"]="false";#參考資料:#無.#備註:#無.$findManyKeyWordsFromManyString=search::findManyKeyWordsFromManyString($conf["search::findManyKeyWordsFromManyString"]);unset($conf["search::findManyKeyWordsFromManyString"]);#如果執行失敗if($findManyKeyWordsFromManyString["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#如果沒有關鍵字if($findManyKeyWordsFromManyString["foundedAll"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$findManyKeyWordsFromManyString;#回傳結果return $result;}#if end#針對每個群組名稱foreach($findManyKeyWordsFromManyString["foundedFalseKey"] as $group){#記錄group$groups[]=trim($group);}#foreach end#檢查有無 wheel 群組在裡面#函式說明:#檢查一個數值是否與陣列裏面的元素相同,找到一個相符合的元素後就會停止搜尋.#回傳結果:#$result["status"],"true"表示執行正確,"false"表示執行錯誤.#$result["founded"],"true"表示有找到相同的,"false"表示沒有找到相同的.#$result["error"],錯誤訊息#$result["function"],當前執行的函數名稱#$result["argv"],使用的參數#$result["equalVarName"],相等的變數名稱或key.#$result["equalVarValue"],相等的變數數值內容.#必填參數:#$conf["conditionElement"],字串,條件元素,要等於的元素內容.$conf["cmd::getEqualVar"]["conditionElement"]="wheel";#$conf["compareElements"],字串陣列,要比對的陣列變數內容.$conf["cmd::getEqualVar"]["compareElements"]=$groups;#可省略參數:#無.#參考資料:#無.#備註:#無.$getEqualVar=search::getEqualVar($conf["cmd::getEqualVar"]);unset($conf["cmd::getEqualVar"]);#如果執行失敗if($getEqualVar["status"]==="false"){#設置執行失敗$result["status"]="false";#設置錯誤訊息$result["error"]=$getEqualVar;#回傳結果return $result;}#if end#如果是 可以用 sudo 的賬號if($getEqualVar["founded"]==="true"){#設置為 wheel 群組的成員$result["phpUserType"]="wheel";}#if end#只要找到一個,結束foreachbreak;}#else end}#foreach endbreak;}#switch end}#foreach end}#else end}#if end#取得server的ip$result["serverIp"]=gethostbyname(gethostname());#設置通訊協定$result["scheme"]="file";#設置為cmd模式$result["mode"]="cmd";#設置用戶端要求的完整網址$result["requestUriFull"]=__FILE__;#函式說明:#將字串特定關鍵字與其前面的內容剔除#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["warning"],警告訊息鎮列.#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要處理的原始字串內容.#$result["content"],處理好的的字串內容.#必填參數:#$conf["stringIn"],字串,要處理的字串.$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$result["requestUriFull"];#$conf["keyWord"],字串,特定字串.$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="/";#可省略參數:#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.$conf["stringProcess::delStrBeforeKeyWord"]["recursive"]="true";#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則回改回傳該內容.#$conf["lastResult"]=$delStrBeforeKeyWord;#參考資料:#無.#備註:#無.$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);unset($conf["stringProcess::delStrBeforeKeyWord"]);#如果執行失敗if($delStrBeforeKeyWord["status"]==="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$insertData;#回傳結果return $result;}#if end#取得目前要求執行的網址爲$result["requestUri"]=$delStrBeforeKeyWord["content"];}#else end#函式說明:#取得apache接收到的header#回傳結果:#$result["status"],執行成功與否,"true"代表成功,"false"代表失敗.#$result["content"],取得的header陣列.#$result["function"],當前執行的函數名稱.#必填參數:#無#可省略參數:#無#參考資料:#無.#備註:#無.$getReceivedHeaders=header::getReceivedHeaders();#如果執行失敗if($getReceivedHeaders["status"]=="false"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]=$getReceivedHeaders;#回傳結果return $result;}#if end#設置取得的 header 陣列$result["header"]=$getReceivedHeaders["content"];#取得讀取到 body 字串$result["body"]=file_get_contents('php://input');#執行到這邊代表執行正常$result["status"]="true";#回傳結果return $result;}#function getConnectionInfo end/*#函式說明:#回傳可以連線到伺服器端網頁的port#回傳結果:#$result,可以連線到伺服器端網頁的port#必填參數:#無.#可省略參數:#無.#參考資料:#http://php.net/manual/en/reserved.variables.server.php#備註:#無.*/public static function getClientPort(){#取得可以連線到伺服器端網頁的port$clientPORT = $_SERVER['SERVER_PORT'];#回傳使用者的IPreturn $clientPORT;}#function getClientPORT end/*#函式說明:#取得 dns/ip 的地理位置資訊#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"],取得的回應內容.#必填參數:#$conf["fileArgu"],字串,__FILE__的內容.#$conf["fileArgu"]=__FILE__;#可省略參數:#$conf["addr"],字串,dns或ip.#$conf["addr"]="";#參考資料:#無.#備註:#請檢查參數.*/public static function getIpGeo($conf=array()){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#如果沒有變數 addrif(!isset($conf["addr"])){#取得用戶端ip#函式說明:#回傳用戶端的IP位置#回傳的結果:#$result,用戶端的ip,若在命令列下執行則回傳getServerIP()的結果.$conf["addr"]=csInformation::getClientIP();}#if end#查詢相關地理位置資訊的網址$endPoint="https://tools.keycdn.com/geo.json?host=".$conf["addr"];#函式說明:#運行curl cmd#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"],取得的回應內容.#$result["cmd"],執行的command#必填參數:#$conf["url"],字串,目標url.$conf["catchWebContent::curlCmd"]["url"]=$endPoint;#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["catchWebContent::curlCmd"]["fileArgu"]=$conf["fileArgu"];#可省略參數:#$conf["header"],字串陣列,要傳送的header.$conf["catchWebContent::curlCmd"]["header"]=array("User-Agent: keycdn-tools:https://www.qbpwcf.org");#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".#$conf["allowAnySSLcertificate"]="";#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.#$conf["catchWebContent::curlCmd"]["postVar"]=$post;#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.#$conf["urlEncode"]="false";#$conf["agent"],字串,user agent的名稱.$conf["catchWebContent::curlCmd"]["agent"]="Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0";$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);unset($conf["catchWebContent::curlCmd"]);#如果運行失敗if($curlCmd["status"]==="false"){#設置錯誤狀態$result["status"]="false";#設置錯誤訊息$result["error"]=$curlCmd;#回傳結果return $result;}#if end#設置執行正常的識別$result["status"]="true";/*範例回傳結果:{"status":"success","description":"Data successfully received.","data":{"geo":{"host":"www.google.com","ip":"74.125.29.147","rdns":"qg-in-f147.1e100.net","asn":"AS15169","isp":"Google Inc. ","country_name":"United States","country_code":"US","region":"CA","city":"Mountain View","postal_code":"94043","continent_code":"NA","latitude":37.419200897217,"longitude":-122.05740356445,"dma_code":807,"area_code":650,"timezone":"America\/Los_Angeles","datetime":"2015-05-22 09:10:35"}}}}or{"status":"error","description":"Hostname did not resolve any IP."}*/#解析回應$res=json_decode($curlCmd["content"][0]);#如果查詢失敗if($res->status==="error"){#設置錯誤狀態$result["status"]="false";#設置錯誤訊息$result["error"]=$res;#回傳結果return $result;}#if end#取得回應的內容$result["content"]=$res->data->geo;#回傳結果return $result;}#function getIpGeo end/*#函式說明:#將ipv4轉換成ipv6#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["content"],取得的回應內容.#$result["argu"],使用的參數.#必填參數:#$conf["ipv4"],字串,人可讀的ipv4字串.$conf["ipv4"]="";#可省略參數:#無.#參考資料:#http://benjr.tw/17314#https://www.ultratools.com/tools/ipv4toipv6#備註:#無.*/public static function ipv4toipv6($conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif($conf==null){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填寫的參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variable::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variable::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可以省略的參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variable::checkArguments"]["mustBeFilledVariableName"]=array("ipv4");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.$conf["variable::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.$conf["variable::checkArguments"]["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["skipableVariableCanNotBeEmpty"]=array();#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["skipableVariableName"]=array();#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["skipableVariableType"]=array();#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["skipableVarDefaultValue"]=array("");#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料來源:#array_keys=>http://php.net/manual/en/function.array-keys.php$checkArguments=variableCheck::checkArguments($conf["variable::checkArguments"]);unset($conf["variable::checkArguments"]);#如果檢查參數失敗if($checkArguments["status"]==="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$checkArguments;#回傳結果return $result;}#if end#分割每個ipv4的數字#函式說明:#將固定格式的字串分開,並回傳分開的結果。#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息陣列#$result["function"],當前執行的函數名稱.#$result["argu"],使用的參數.#$result["oriStr"],要分割的原始字串內容#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。#$result["dataCounts"],爲總共分成幾段#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.#必填的參數:$conf["stringProcess::spiltString"]["stringIn"]=$conf["ipv4"];#要處理的字串。$conf["stringProcess::spiltString"]["spiltSymbol"]=".";#爲以哪個符號作爲分割#可省略參數:#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);unset($conf["stringProcess::spiltString"]);#如果執行失敗if($spiltString["status"]==="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果沒有找到切割用的關鍵字if($spiltString["found"]==="false"){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#如果沒有切割出4段if($spiltString["dataCounts"]!==4){#設置執行不正常$result["status"]="false";#設置錯誤訊息$result["error"]=$spiltString;#回傳結果return $result;}#if end#轉換每段ip位置為16進位$ipv6="0:0:0:0:0:ffff:".sprintf('%2x',$spiltString["dataArray"][0]).sprintf('%02x',$spiltString["dataArray"][1]).":".sprintf('%2x',$spiltString["dataArray"][2]).sprintf('%02x',$spiltString["dataArray"][3]);#取得 ipv6$result["content"]=$ipv6;#設置執行正常$result["status"]="true";#回傳結果return $result;}#function ipv4toipv6 end}#class csInformation end?>