我正在使用blenc函数加密一些PHP代码。
环境如下:
- Lighttpd作为启用了fastcgi模块的web服务器
- 存储在/usr/local/etc/blenckeys中的密钥
- 一个加密的PHP脚本,可以在cli或web模式中使用
- 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套接字:unix:/tmp/php.socket-02016-03-09 08:48:45:(mod_fastcgi.c.3346(未收到响应,发送的请求:1078在套接字上:unix:/tmp/php.socket-0/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");
}
最后,在客户端上安装新软件包时,读取"ekey"文件并覆盖现有密钥:
$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和快速cgi有一个我无法解释的错误,或者可能是配置错误。
我准时在另一个SO问题中读到blenc有问题。如果不能看到你的代码,尽管我不能确认这一点。显然,PHP文档显示了错误的代码(正如我刚才检查的那样,我可以确认它仍然是错误的(。所以我假设您使用的是PHP文档中的代码,这是错误的。代替:
file_put_contents($key_file, $redistributable_key, FILE_APPEND);
您应该使用:
file_put_contents($key_file, $redistributable_key."n", FILE_APPEND);
这将解释为什么你的剧本第一次有效而第二次无效。第一个代码示例将所有键写入同一行,而不是一个新行,这会损坏键。