blenc_encrypt - php-cgi进程崩溃

时间:2016-03-09 09:05:46

标签: php fastcgi lighttpd blenc

我使用blenc函数加密某些PHP代码。

环境如下:

  • Lighttpd作为启用了fastcgi模块的Web服务器
  • 密钥存储在/ usr / local / etc / blenckeys
  • 可在cli或web模式下使用的加密PHP脚本
  • php.ini在cgi和cli之间完全相同

如果我在cli模式下使用加密脚本,则不会出现问题

如果我通过lighttpd(cgi)使用相同的加密脚本,我会收到500内部错误 -

http://x.x.x.x/myscript.php的第一次调用有效,但以下内容将因此错误而失败

  

2016-03-09 08:48:45 :( mod_fastcgi.c.2562)意外的文件结束   (也许fastcgi进程死了):pid:1886 socket:   UNIX:/tmp/php.socket-0       2016-03-09 08:48:45 :( mod_fastcgi.c.3346)没有收到响应,请求发送:1078 on socket:unix:/tmp/php.socket-0 for   /myscript.php,关闭连接

修改

感谢我的同事,我找到了问题并知道如何解决这个问题。

问题来自Zend OPcache,它与blenc扩展不兼容。

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=0

修改

当然,我可以分享部分代码:

在包装(我加密代码的地方)中,我将重新分发密钥存储到“ekey”中。档案:

由于我对所有加密文件使用相同的密钥,因此所有文件的重新分发密钥都相同:

$encryptionKey = md5("myApp".rand (1, 65534).time());
if ($obfuscate) {
    $redistributionKey = blenc_encrypt("someText", "/tmp/ekey", $encryptionKey);
    file_put_contents(__DIR__."/ekey", $redistributionKey);
}

下一步是使用相同的$encryptionKey加密文件 - 剥离PHP标记:

$oFileNoTags = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $oFile);
if (function_exists("blenc_encrypt")) {
    $redistributionKey = blenc_encrypt($oFileNoTags, $destFolder.basename($file), $encryptionKey);
} else {
    $this->errror(570, "blenc_encrypt function not available. Please install first using PECL");
}

最后,在客户端安装新软件包时,&#39; ekey&#39;读取文件并覆盖现有密钥:

$newKeyEncryptionValue = file_get_contents(__DIR__."/ekey");
if (strpos($keyFileContent, $newKeyEncryptionValue) === false) {
    // file_put_contents($keyFile, $newKeyEncryptionValue."\n", FILE_APPEND);
    $this->system("echo '".$newKeyEncryptionValue."' | sudo tee ".$keyFile);
}

我想blenc和fast-cgi有一个错误我无法解释或者可能是错误配置的。

1 个答案:

答案 0 :(得分:0)

我在另一个SO问题上准时读到blenc有问题。虽然我无法确认您的代码,但却无法看到您的代码。显然,PHP文档显示错误的代码(我可以确认它仍然是错误的,因为我刚刚检查过)。因此,我将假设您正在使用PHP文档中的代码,这是错误的。而不是:

file_put_contents($key_file, $redistributable_key, FILE_APPEND);

您应该使用:

file_put_contents($key_file, $redistributable_key."\n", FILE_APPEND);

这将解释为什么您的脚本第一次运行而不是第二次运行。第一个代码示例将所有键写入同一行,而不是新行,这会损坏键。