一、大體流程圖
二、PHP 項目文件加密
?下表列出了Zend產品中的PHP版本及其內部API版本和Zend產品版本。
如何加密請往后看
三、如何使用
第一步:確認當前環境 Amai Phalcon 前,請確認您具備以下兩個條件,如果您的環境不滿足此條件,建議您對系統環境進行重新配置。
條件1:PHP版本在5.5.X以上(必須為NTS)
條件2:必須安裝ZendGuardLoader
第二步:生成機器碼,機器碼是授權文件的重要組成部分,每一臺服務器都有一個獨立的機器碼,您只需運行由 我們所提供的機器碼生成工具來獲取您的機器碼即可。
注: 每一臺服務器的機器碼都是獨立的,如果您 是需要將 ECstore 部署在多臺服務器上, 您需要生成多個機器碼 在windows/linux終端運行hardware.sh,獲取機器碼如圖:
(1)Windows 環境
(2)Linux 環境
第三步:申請授權文件,在郵件中,寫入您的機器碼與您的公司名稱,以郵件形式發送至overcome.wan@gmial.com 進行申請授權文件。郵件標題以“申請ego license授權文件”注明
第四步:獲取授權文件及部署
1. 如果您提供的信息有效,您將會以郵件形式獲取到您的license授權文件:“license.zl” 把該文件放入在ecstore安裝目錄下 ?
2. 編輯php.ini文件,搜索‘zend_loader.license_path’ ?
3. 加上zend_loader.license_path=‘Phalcon Web 安裝目錄/license.zl’ ?
4. 重啟web server ?
5. 通過瀏覽器打開您的網店地址,這就表示您的 license 授權文件安 裝成功,可繼續進行安裝 ?
6. 完成后記:如果您的研發人員需要在本地進行開發,我們為您提供針對研發人員本地開發的 license文件:“developer.zl”,開人人員無需進行申請,直接部署在自己的電腦上開發即可。
本地開發license文件位置:Phalcon 目錄下developer.zl
?第五步:很遺憾,PHP 的Phalcon框架暫時不支持加密,一下為官方郵件(該郵件為20170512官方回復)
?
===========Windows 環境測試 ============================
安裝要求:
1、php版本 < 5.6
2、把加密的php文件上傳到服務器上看看效果,提示php文件采用了Zend Guard加密,需要安裝Zend Loader/ZendOptimizer
3、Zend Guard Loader 僅支持NTS
4、修改php.ini文件
5、重啟服務器
詳細步驟:
1、下載Zend Guard Loader (Runtime for PHP 5.5 or 5.6),在這里我選擇Windows版本:http://www.zend.com/en/products/loader/downloads#Windows
2、phpStudy 安裝,將下載好后解壓壓縮包zend-loader-php5.6-windows-x86_update1.zip?,找到目錄下的 ZendLoader.dll 文件,將它放到你的php目錄下ext下,再編輯php.ini文件,添加一段代碼(如):
在這里編輯:E:\phpStudy\php\php-5.6.27-nts\php.ini
[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3
zend_loader.license_path=""
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"
選擇一個php5.6 的非安全線程去啟動
運行phpinfo(),會看到如下信息:
3、下載ZendGuard-7.0.0-win32.win32.x86.msi,http://www.zend.com/en/products/guard/direct,關于如何加密文件和項目:【PHP】用Zend加密PHP源碼/保護你的源代碼圖文教程
4、測試代碼,就以ThinkPhp5.0 的官方代碼為案例進行測試
加密前的代碼文件:thinkphp_5_full
加密后的代碼文件:thinkphp_5_full_encode
使用Visual Studio Code 分別打開加密前和加密后的代碼項目:thinkphp_5_full
通過瀏覽器訪問頁面效果:
thinkphp_5_full_encode
可以看出已被加密成二進制文件了,不能打開,通過瀏覽器訪問則是正常的
注意:把加密后的代碼放在項目目錄中,如使用了ZendGuard加密的PHP代碼的網站,而沒有安裝Zend Guard Loader,就會出現下圖錯誤(Zend Guard Run-time support missing!):
?安裝遇到的坑
分析原因:由于我安裝的php 版本為TS ,意思就是安全線程,Windows版的PHP從版本5.2.1開始有Thread Safe和NoneThread Safe之分。
【1】Thread Safe是線程安全,執行時會進行線程(Thread)安全檢查,以防止有新要求就啟動新線程的CGI執行方式而耗盡系統資源。
【2】Non Thread Safe是非線程安全,在執行時不進行線程(Thread)安全檢查。
Thread Safety : enable 是不能安裝 ZendLoader.dll 的(Installing Zend Guard Loader for any PHP-NTS distribution)不安線程成才可以的
許可認證為空?
修改配置參數:(禁用修改為不禁用),重啟服務器即可
zend_loader.disable_licensing=1 修改為:zend_loader.disable_licensing=0
完整配置:
[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\php\php-5.6.27-nts\WWW/tp52.zl"
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"
參考文獻:
1、如何對PHP文件進行加密——ZendGuard加密與ZendLoader解密?
2、ecstore 授權文件的安裝
3、官方文檔:http://www.zend.com/en/products/zend-guard?
4、官方安裝 Zend Guard Loader
5、注冊Zend Guard?
6、Zend Guard功能
7、圖解PHP使用Zend Guard 6.0加密方法教程
======================啟用許可認證license======================
需要先生成一個 license.zl,然后把該文件配置到php.ini 文件中
?選擇正確的PHP 版本,很重要的哦
?
?選擇安全,配置license,注意:第四步的 名稱和編碼的要一樣哦(ThinkPHP-Encode-License)
?
最后生成的加密文件(二進制文件)
復制該文件到項目目錄下去
瀏覽器訪問:
說明:以上提示表示沒有配置 license路徑,于是提示php警告,這時候我們查看配置文件php.ini
[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\WWW/Product_TP5.zl"
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"
也就是以上紅色部分文件加載的文件不是方才生成的文件,修改為以下配置(剛才生成的文件),重啟服務器
zend_loader.license_path="E:\phpStudy\WWW/ThinkPHP-Encode-License.zl"
?
刷新剛才訪問的網頁文件,就可以正常訪問了
在這里用的是試用版,有一下問題
1、加密的代碼不會優化;
2、加密的文件14天后過期;
3、如果使用license授權,license 3天后過期。
?
============== Linux 安裝測試====================
1、如何安裝PHP,查看我的另外一篇博客:http://www.cnblogs.com/tinywan/p/6647587.html?/
2、一定要是NTS
3、下面使用連個項目對比測試加密效果
【1】項目名稱:thinkphp_5_full ?Nginx配置端口號:8080
nginx.conf配置文件:
# thinkphp_5_full
server {listen 8080;server_name 127.0.0.1;set $root_path /home/www/thinkphp_5_full/public;root $root_path;index index.php index.html;location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=/$1 last;break;}}location ~ \.php$ {try_files $uri =404;fastcgi_pass unix:/var/run/php5-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}
通過瀏覽器訪問8080端口,訪問正常
?
?
【2】項目名稱:ThinkPHP-Encode-License 端口號:8088 ?配置文件:nginx.conf
# ThinkPHP-Encode-License
server {listen 8088;server_name 127.0.0.1;set $root_path /home/www/ThinkPHP-Encode-License/public;root $root_path;index index.php index.html;location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=/$1 last;break;}}location ~ \.php$ {try_files $uri =404;fastcgi_pass unix:/var/run/php5-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}
瀏覽器訪問8088端口,訪問已被加密不可以訪問
?
編輯配置文件:vim /etc/php5/fpm/php.ini
[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="/home/www/ThinkPHP-Encode-License.zl"
zend_extension="/home/www/zend-loader-php5.5-linux-x86_64/ZendGuardLoader.so"
phpinfo() 查看是否安裝成功
安裝成功后還是不能夠訪問:
Nginx 錯誤日式
2017/05/23 10:34:59 [error] 5503#0: *9 FastCGI sent in stderr: "PHP message: PHP Fatal error: Incompatible file format: The encoded file has format major ID 7,
whereas the Loader expects 6 in /home/www/ThinkPHP-Encode-License/public/index.php on line 0" while reading response header from upstream,
為什么這樣子來!PHP加密時候的版本問題嗎啊?昨天是5.6 呀,今天在Linux 的是5.5 呀。怎么可以使用昨天的來調試這個來,,,,無語..............?新建個工程:ThinkPHP-Encode-License-5.5
這時候先切換到windows ,同時改變php 版本為5.5,我們寫個test.php 文件進行測試
訪問項目還是一個吊樣啊!不行啊!大哥
你是加載錯誤的許可認證嗎?一看配置文件,空的呀!原始切換文件就是什么都沒有了
擴展都沒安裝,怎么可鞥?
?去官方在下載個5.5 版本的倒騰下?
[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\WWW/ThinkPHP-Encode-License-5.5.zl"
zend_extension="E:\phpStudy\php\php-5.5.38\ext\ZendLoader.dll"
google 一番 看到這個表?https://support.zend.com/hc/en-us/articles/217058968
日志報錯:
astCGI sent in stderr: "PHP message: PHP Fatal error: Incompatible file format: The encoded file has format major ID 7, whereas the Loader expects
?看來是這個加密工具版本的為題了:Zend Guard 7 (64-bit) ,仔細琢磨,原來我一直加密使用的PHP版本是php5.6 版本,這個前面已經說過了的,如圖所示:
在這里我們在重新加密一次。記得這次一定要選php5.5 版本(linux 安裝的php 版本為5.5.9)
最后生成的文件上傳到Nginx服務器目錄,修改配置文件
(1)vim /usr/local/nginx/conf/nginx.conf
set $root_path /home/www/ThinkPHP-Encode-License-5.5/public;
root $root_path;
(2)vim /etc/php5/fpm/php.ini
[Zend.loader]
zend_extension="/home/www/ZendGuardLoader.so"
zend_extension="/home/www/opcache.so"
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="/home/www/ThinkPHP-Encode-License-5.5.zl"
重啟php5-fpm 和Nginx,打開頁面查看,已經OK
?
?在這里為了測試,給一個錯誤的許可認證文件?ThinkPHP-Encode-License-5.5-error.zl
zend_loader.license_path="/home/www/ThinkPHP-Encode-License-5.5-error.zl"
可以看出Nginx直接報錯
?
錯誤日志:
[error] 7091#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 58.101.3.167, server: 127.0.0.1,
request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:",
重新配置回原來正確的許可認證,則可以正常訪問啦
注: 每一臺服務器的機器碼都是獨立的,如果您 是需要將 ECstore 部署在多臺服務器上, 您需要生成多個機器碼 在windows/linux終端運行hardware.sh,獲取機器碼如圖:
腳本文件:hardware.sh
#!/usr/bin/env php
<?phpfunction command_hardware(){if(function_exists('zend_loader_enabled') && zend_loader_enabled()){foreach (zend_get_id() as $hardware) {echo $hardware, "\n";}} else {echo 'zend guard loader not installed or not enabled!';exit;}}
command_hardware();
Linux 下面 ,在這里為cli 模式,所以別忘記給cli 模式的配置文件也安裝ZendLoader 擴展庫,否則報錯:zend guard loader not installed or not enabled!
windows 下面
PHP CLI 命令行 運行加密文件可能出現的問題
加密主機號
***************針對Linux 環境 Phalcon框架擴展和Zend Guard Loader 擴展沖突的問題*******
以上測試PHP配置文件是沒有安裝Phalcon擴展,一點安裝Phalcon擴展,啟動Nginx則會直接報錯
配置?vim /etc/php5/fpm/php.ini 添加一下內容:
[Zend.loader]
zend_extension="/usr/lib/php5/ZendGuardLoader.so"
zend_extension="/usr/lib/php5/20121212/opcache.so"
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3
重啟 php-fmp 出現一下錯誤頁面信息
?
Nginx錯誤日志:"GET /info.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:"
注釋掉上面/etc/php5/fpm/php.ini?的內容,重啟php-fmp 繼續測試,可以正常顯示
?總結:如果安裝Phalcon 擴展則在?/etc/php5/fpm/php.ini 添加?zend_extension 擴展則會出現問題
?以上都是自己踩的坑啊!
-----------------------正式開始》》》》》》》》》》》》》》》》
我們看看Phalcon擴展文件添加在那里了,原來在這個文件夾下面
root@iZ238xopqw6Z:/home/www# find / -name phalcon.so
/usr/lib/php5/20121212/phalcon.so
我們復制?ZendGuardLoader.so 到/usr/lib/php5/20121212 文件夾下面
root@iZ238xopqw6Z:/home/www# cp /usr/lib/php5/ZendGuardLoader.so /usr/lib/php5/20121212/ZendGuardLoader.so
root@iZ238xopqw6Z:/home/www# cd /usr/lib/php5/20121212/
root@iZ238xopqw6Z:/usr/lib/php5/20121212# ls
curl.so gd.so json.so ldap.so mysqli.so mysql.so opcache.so pdo_mysql.so pdo.so phalcon.so readline.so redis.so ZendGuardLoader.so
當然了這是php5.5.9 和php7不一樣了,老規矩,新建文件vim?/etc/php5/mods-available/zend-loader.ini 添加以下內容
cd?/etc/php5/mods-available?
vim zend-loader.ini
[zend.loader]
zend_extension=ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=2
zend_loader.license_path="/home/www/thinkphp_5-encode-5.5.zl"
切換到目錄/etc/php5/fpm/conf.d 做一個軟連接文件(sudo ln -s 源文件 目標文件)
ln -s ../../mods-available/zend-loader.ini 02-zend-loader.ini
重啟php-fmp 繼續測試,nginx沒有報錯
配置文件加載的信息
?
?
?