『壹』 如何使用php的外部函數功能
1.缺少declare,正確的描述如下
private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
2 declare的說明
Declare 語句
用於在模塊級別中聲明對動態鏈接庫 (DLL) 中外部過程的引用。
語法 1
[Public | Private] DeclareSubnameLib"libname" [Alias"aliasname"] [([arglist])]
語法 2
[Public | Private] DeclareFunctionnameLib"libname" [Alias"aliasname"] [([arglist])] [Astype]
Declare 語句的語法包含下面部分:
部分 描述
Public 可選的。用於聲明對所有模塊中的所有其它過程都可以使用的過程。
Private 可選的。用於聲明只能在包含該聲明的模塊中使用的過程。
Sub 可選的(但Sub 或 Function 二者需選其一)。表示該過程沒有返回值。
Function 可選的(但Sub 或 Function 二者需選其一)。表示該過程會返回一個可用於表達式的值。
name 必需的。任何合法的過程名。注意動態鏈接庫的入口處(entry points)區分大小寫。
Lib 必需的。指明包含所聲明過程的動態鏈接庫或代碼資源。所有聲明都需要Lib 子句。
libname 必需的。包含所聲明的過程動態鏈接庫名或代碼資源名。
Alias 可選的。表示將被調用的過程在動態鏈接庫 (DLL)
中還有另外的名稱。當外部過程名與某個關鍵字重名時,就可以使用這個參數。當動態鏈接庫的過程與同一范圍內的公用變數、常數或任何其它過程的名稱相同時,也可以使用
Alias。如果該動態鏈接庫過程中的某個字元不符合動態鏈接庫的命名約定時,也可以使用 Alias。
aliasname 可選的。動態鏈接庫或代碼資源中的過程名。如果首字元不是數字元號 (#),則
aliasname 是動態鏈接庫中該過程的入口處的名稱。如果首字元是
(#),則隨後的字元必須指定該過程的入口處的順序號。
arglist 可選的。代表調用該過程時需要傳遞的參數的變數表。
type 可選的。Function 過程返回值的數據類型;可以是 Byte、布爾、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持變長)或 Variant,用戶定義類型,或對象類型。
arglist 參數的語法以及語法各個部分如下:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [Astype]
『貳』 怎麼用php命令執行php代碼
PHP執行命令的四種方法
方法一:使用exec函數執行系統外部命令
原型:function exec(string $command,array[optional] $output,int[optional]
$return_value)
<?
exec("dir",$outPut);
print_r($outPut);
?>
說明:列出和PHP執行文件同級目錄下的所有目錄及文件信息。
知識點:exec執行系統外部命令時不會輸出結果,而是返回結果的最後一行,如果你想得到結果你可以使用第二個參數,讓其輸出到指定的數組,此數組一個記錄代表輸出的一行,即如果輸出結果有20行,則這個數組就有20條記錄,所以如果你需要反復輸出調用不同系統外部命令的結果,你最好在輸出每一條系統外部命令結果時清空這個數組,以防混亂。第三個參數用來取得命令執行的狀態碼,通常執行成功都是返回0。
方法二:使用system函數執行系統外部命令
原型:function system(string $command,int[optional] $return_value)
1
2
3
<?
system("dir");
?>
知識點:system和exec的區別在於system在執行系統外部命令時,直接將結果輸出到游覽器,如果執行命令成功則返回true,否則返回false。第二個參數與exec第三個參數含義一樣。
方法三:使用函數passthru執行系統外部命令
原型:function passthru(string $command,int[optional] $return_value)
知識點:passthru與system的區別,passthru直接將結果輸出到游覽器,不返回任何值,且其可以輸出二進制,比如圖像數據。
方法四:反撇號`(和~在同一個鍵)執行系統外部命令
1
2
3
<?
echo `dir`;
?>
知識點:在使用這種方法執行系統外部命令時,你要確保shell_exec函數可用,否則是無法使用這種反撇號執行系統外部命令的。
『叄』 php如何調用外部php文件中的函數
在實驗的時候發現是可以的,代碼如下
<?php
function func(){ echo "I'm a external function <br />"; }
class Test {
function doExternalFunction($_externalFunc, $_param){
func();
$_externalFunc($_param);
}
}
function sayHello($_param){
echo "hello, $_param";
};
$name = "HanMeiMei";
$test = new Test();
$test->doExternalFunction("sayHello", $name);
?>
在調用Test類實例的doExternalFunction()方法時,外部的func()方法是可以運行的,因為它是全局的。但是建議不要這樣使用,
因為Test::doExternalFunction()對func()函數有依賴,當項目比較大時,而func()和Test類沒有同時引入到一個文件中來,會引
起錯誤。比較理想的情況是,使用回調函數的形式來調用外部函數,就像執行在Test::doExternalFunction()執行sayHello()一樣
『肆』 怎樣在一個PHP文件中執行另一個PHP文件
二種方法:
1.在伺服器端執行:
即在伺服器端PHP文件解析的時候執行,使用include(),require()函數將文件引入
include("thatday.php");
然後調用thatday.php中的主函數
2.在客戶端執行:
此方法的效果等同於iframe,即會產對所執行文件的一次訪問.
<img src="thatday.php" width="0" height="0" border="0">
『伍』 在伺服器上用php調用cmd執行某exe文件,求代碼!!!!
很多情況下需要php調用其他程序如shell命令、shell腳本、可執行程序等等,此時需要使用到諸如exec/system/popen/proc_open等函數,每種函數有各自適合使用的場景以及需要注意的地方。
前提:PHP沒有運行在安全模式
如果PHP運行在安全模式下,那麼在執行外部命令、打開文件、連接資料庫、基於HTTP的認證這4個方面將會受到制約,可能在調用外部程序時無法獲取預期的結果,此時需要設置特定目錄,可以在php.ini中編輯safe_mode_exec_dir參數來指定。
1. exec
原型:string exec ( string command [, array &output [, int &return_var]] )
描述:返回值保存最後的輸出結果,而所有輸出結果將會保存到$output數組,$return_var用來保存命令執行的狀態碼(用來檢測成功或失敗)。
例子:$ret = exec("ls -al", $output, $var);
注意:
A. 輸出結果會逐行追加到$output中,因此在調用exec之前需要unset($output),特別是循環調用的時候。
B.
如果想通過exec調用外部程序後馬上繼續執行後續代碼,僅僅在命令里加"&"是不夠的,此時exec依然會等待命令執行完畢;需要再將標准輸出
做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);
C.
要學會善用EscapeShellCmd()和EscapeShellArg()。函數EscapeShellCmd把一個字元串
中所有可能瞞過Shell而去執行另外一個命令的字元轉義。這些字元在Shell中是有特殊含義的,象分號(|),重定向(>)和從文件讀入
(<)等。函數EscapeShellArg是用來處理命令的參數的。它在給定的字元串兩邊加上單引號,並把字元串中的單引號轉義,這樣這個字元串
就可以安全地作為命令的參數。
2. system
原型:string system ( string command [, int &return_var] )
描述:執行給定的命令,返回最後的輸出結果;第二個參數是可選的,用來得到命令執行後的狀態碼。
例子:$ret = system("ls -al", $var);
注意:略。
3. passthru
原型:void passthru (string command [, int return_var])
描述:執行給定的命令,但不返回任何輸出結果,而是直接輸出到顯示設備上;第二個參數可選,用來得到命令執行後的狀態碼。
例子:passthru("ls -al", $var);
注意:略。
4. popen
原型:resource popen ( string command, string mode )
描
述:打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。 返回一個和 fopen()
所返回的相同的文件指針,只不過它是單向的(只能用於讀或寫)並且必須用 pclose() 來關閉。此指針可以用於 fgets(),fgetss()
和 fwrite()。
例子:$fd = popen("command", 'r'); $ret = fgets($fd);
注意:只能打開單向管道,不是'r'就是'w';並且需要使用pclose()來關閉。
5. proc_open
原
型:resource proc_open ( string cmd, array descriptorspec, array
&pipes [, string cwd [, array env [, array other_options]]] )
描述:與popen類似,但是可以提供雙向管道。具體的參數讀者可以自己翻閱資料,比如該博客:http://hi..com/alex_wang58/blog/item/a28657de16fec55195ee372a.html。
注意:
A. 後面需要使用proc_close()關閉資源,並且如果是pipe類型,需要用pclose()關閉句柄。
B. proc_open打開的程序作為php的子進程,php退出後該子進程也會退出。
C. 筆
者在使用的時候遇到獲取外部程序輸出阻塞的問題,也就是在例子中的fgets($pipes[1])語句阻塞了,無法繼續進行。經過多方查證後發現,問題
一般出在外部程序中,比如外部程序是C程序,使用fprintf(stdin, "****
\n");輸出結果,此時需要加上fflush(stdout);才行,否則輸出結果可能會暫留緩存中,無法真正輸出,而php也就無法獲取輸出了。
例子:
///< 打開管道
$pwd = "*****";
$pipes = array();
$command = "*****";
$desc = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w'));
$handle = proc_open($command, $desc, $pipes, $pwd);
if (!is_resource($handle)) {
fprintf(STDERR, "proc_open failed.\n");
exit(1);
}
///< 讀寫
fwrite($pipes[0], "*****\n");
$ret = rtrim(fgets($pipes[1]), "\n");
///< 關閉管道
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($handle);
『陸』 常見WEB攻擊之命令注入
即 Command Injection。是指通過提交惡意構造的參數破壞命令語句結構,從而達到執行惡意命令的目的。
在Web應用中,有時候會用到一些命令執行的函數,如php中system、exec、shell_exec等,當對用戶輸入的命令沒有進行限制或者過濾不嚴導致用戶可以執行任意命令時,就會造成命令執行漏洞。
黑客將構造好的命令發送給web伺服器,伺服器根據拼接命令執行注入的命令,最後講結果顯示給黑客。
以DVWA為例,下面使用ping命令測試IP,正常輸入一個IP或者域名會返回一個正常的返回結果。
當輸入惡意構造的語句 www..com && netstat -an,會把後面的語句也給執行了:
執行結果:
PHP的常見命令執行函數:
system(),exec(),shell_exec(),passthru()
1、system()
system — 執行外部程序,並且顯示輸出
常規用法:
使用PHP執行:
php test1.php www..com
exec — 執行一個外部程序
3、shell_exec()
shell_exec — 通過 shell 環境執行命令,並且將完整的輸出以字元串的方式返回。
4、passthru()
passthru() 函數與 exec() 函數類似,執行外部程序並且顯示原始輸出。
Windows:
用^轉義<
如果加上單引號會寫不進去,如果加雙引號會把雙引號一起寫進去,所以要用^轉義<
linux:
linux下需要用來轉義<,不過很多php都默認開啟gpc,可以先用16進制轉換一句話再用xxd命令把16進制還原.
<?php eval($_POST[pass]);>
轉換為16進制:
由於我用的是Linux,所以使用payload寫入一句話:
寫入成功:
1、採用白名單,或使用正則表達式進行過濾。
2、不要讓用戶可以直接控制eval()、system、exec、shell_exec等函數的參數。
3、在進入執行命令函數和方法前,對變數進行過濾,對敏感字元進行轉義。