从PerlCGI执行PHP

首先,作为背景,我试图在创建新实体时加密我们在服务器上的数据。这是在一个起源于 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 并将文件作为参数传递给每种情况。到目前为止,我唯一发生的事情是:

  1. 打印 exec/system 的输出...将 Perl 文件(甚至不是 php 文件)作为文本生成,我在其他任何地方都没有看到任何提到这种情况的地方,但我所看到的只是 Perl,而不是 CGI 和珀尔在一起。
  2. 没有数据。如果我输出 $! 从 Perl 中,我在使用系统时遇到非法搜索错误,但其他人将其留空。所有这些都返回 0,就好像 exec/system/... 已经运行一样,但服务器端没有任何变化。

从我在线阅读的内容来看,我认为 CGI 可能以某种形式的“受保护”模式运行,该模式禁用了某些文件上的 exec/system/open/backtick 命令,但我不确定这就是问题所在。据我所知,没有迹象表明许可受到限制。如果有人有任何见解,非常感谢。如果您需要更多信息,请告诉我。

回答

一些注意事项:

  • 向我们展示实际、最小和完整的测试程序及其输出,以便我们了解您在做什么。

  • system与父程序共享它的文件句柄,所以如果外部程序向 STDOUT 发送一些东西,那就是它要去的地方。如果那是在您发送 CGI 标头之前,那么事情就会变得一团糟。

  • 反引号将捕获标准输出,但不会捕获标准错误。东西可能仍会进入错误日志。

  • 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 没有机会解释元字符。


以上是从PerlCGI执行PHP的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>