首先,作为后台,我试图在创建新实体时加密服务器上的数据。这是在一个遗留系统上,该系统最初是一个Perl CGI系统,并有一个单独的部分,即PHP。Perl部分创建组,后来实现了PHP对其进行加密
我正在尝试从一个Perl CGI文件中执行PHP加密脚本。我尝试过使用:
exec("/path/to/file arg1 arg2")
system("/path/to/file arg1 arg2")
backtick operator /path/to/file arg1 arg2
open ("/path/to/file arg1 arg2 |)
我还尝试直接指向/bin/php,并将该文件作为每个案例的参数进行传递。到目前为止,我唯一发生的事情是:
- 正在打印exec/system的输出。。。将Perl文件(甚至不是php文件(生成为文本,我在其他地方没有看到过这种情况,但我看到的只是Perl,而不是CGI和Perl
- 没有数据。如果我输出$!在使用系统时,我从Perl中得到了一个非法的查找错误,但其他人将其留空。所有这些都返回0,就好像exec/system/。。。已运行,但服务器端没有任何更改
根据我在网上读到的内容,我认为CGI可能以某种形式运行;"受保护";模式,在某些文件上禁用exec/system/open/backtick命令,但不确定这是问题所在。不过,据我所知,没有迹象表明许可受到限制。如果有人有任何见解,我们将不胜感激。如果你需要更多信息,请告诉我。
几个注意事项:
-
向我们展示实际的、最小的和完整的测试程序及其输出,这样我们就可以看到您在做什么。
-
system
与父程序共享其文件句柄,所以如果外部程序向STDOUT发送了一些内容,那么它就是要发送的。如果那是在你发送CGI标题之前,那么事情就会变得一团糟。 -
backticks将捕获标准输出,但不会捕获标准错误。内容可能仍会进入错误日志。
-
exec
将您的程序转换为其他程序。也就是说,你的Perl程序做了一些设置,然后变成了你执行的东西,然后再也不会回来了(除非事情失败了(。
一些有助于调试的东西:
- 制作一个小的CGI程序,它只需调用另一个您知道应该工作的程序,例如
date
或类似的程序。验证你能做那么多
#!/usr/bin/perl
print "Content-type: text/plainnn";
my $rc = system '/bin/date';
print "result was <$rc>";
- 然后,运行php以显示其版本。验证您是否可以运行php
#!/usr/bin/perl
print "Content-type: text/plainnn";
my $rc = system '/usr/bin/php', '-v';
print "result was <$rc>";
- 慢慢增加复杂性。找出问题的症结所在
如果PHP的参数来自用户输入,请考虑使用污点检查和仔细清理(perlsec(。请注意,我使用了system
的列表版本,所以shell没有机会解释元字符。