ホームページ >バックエンド開発 >PHPチュートリアル >PHP Web サイトのソース コード Zend エンジンを変更して、PHP ソース コード暗号化の原則と実践を実装します。

PHP Web サイトのソース コード Zend エンジンを変更して、PHP ソース コード暗号化の原則と実践を実装します。

WBOY
WBOYオリジナル
2016-07-29 08:37:551038ブラウズ

1. 基本原則
PHP がソース ファイルを読み取るためにインターフェースをインターセプトすることを検討してください。最初は、Apache と PHP の間のインターフェイスを扱うことを考えました。Send_php() 内の Apache の src/modules/php4/mod_php4.c (これは、PHP が静的に Apache にコンパイルされ、make install された後のファイルです) を参照してください。一時ファイルの方法を使用して関数内でインターセプトされ、復号化後にファイル ポインタが置き換えられます。この方法はテストされ、実行可能であることが証明されています。ただし、2 つのファイル操作を使用する必要があるため、非効率的であり、DSO には使用できません。 Shuangyuan Nursing Home
そこで、PHP の読み取りファイルをインターセプトしてキャッシュにロードするプロセスを再検討した結果、zend-scanner.c が Zend エンジンでこれを実行していることがわかりました。このファイルの変更を開始します。照明プロジェクト
2. 実装方法
暗号化モジュールとして libmcrypt を使用し、現在 DES メソッド ECB モード暗号化を使用しています。
以下はファイル暗号化のソース コードです:
C++ コード
/* ecb.c------ -------------ここでカット----------*/
/* php ソース コード バージョン 0.99 ベータ版の暗号化
コードの暗号化には libmcrypt を使用しています、お願いします
まずインストールします。
コマンドラインをコンパイルします:
gcc -O6 -lmcrypt -lm -o encryptphp ecb.c
使用する前に LD_LIBRARY_PATH を設定してください。
GNU copyleft、設計: wangsu、miweicong */
#define MCRYPT_BACKWARDS_COMPATIBLE 1
#define PHP_CACHESIZE 8192
#include < stdio.h >
#include < sys/types h >
#include
main(int argc, char** argv)
int td,inputfilesize,filelength ;
char ファイル名[255];
int readfd;
int keysize=0; struct stat *filestat;
if(argc == 3) {
strcpy(パスワード,argv[2])
} else if(argc = = 4 && !strcmp(argv) [1],"-d")){
strcpy(パスワード,argv[2]);
decode=1;
printf("デコードモードに入ります...n" );
} else {
printf("使用法: encryptphp [-d] パスワード ファイル名");
}
keysize=mcrypt_get_key_size(DES); ;
gen_key_sha1(キー、NULL、0、キーサイズ、パスワード、strlen(パスワード));
td=init_mcrypt_ecb(DES、キー、キーサイズ); )==-1){
printf("致命的: ファイルを開いて読み取ることができません");
}
filestat=malloc(sizeof(stat));
inputfilesize=filestat- >st_size;
printf("filesize は %d n",inputfilesize);
inputfilesize=((int)(floor(inputfilesize/PHP_CACHESIZE ) )+1)*PHP_CACHESIZE; ((file_buffer=malloc(inputfilesize))==NULL){
printf("致命的: ファイルbuffer.n をmallocできません");
}
if ((block_buffer=malloc(PHP_CACHESIZE)) ==NULL){
printf("致命的: ブロック バッファ.n を malloc できません");
exit(2);    
j=0;    
while(realbufsize=read (readfd,block_buffer, PHP_CACHESIZE)){
printf(".");    
if(!decode){
if(realbufsize< PHP_CACHESIZE){
for(i=realbufsize;i< PHP_CACHESIZE;i++){
((char *)block_buffer)[i]=' ';    
}
}
mcrypt_ecb (td, block_buffer, PHP_CACHESIZE);    
} else {
mdecrypt_ecb (td, block_buffer, realbufsize);    
}
memcpy(file_buffer+j*PHP_CACHESIZE,block_buffer,PHP_CACHESIZE);    
j++;    
}
close(readfd);    
if((ifp=fopen(filename,"wb"))==NULL){
printf("FATAL: ファイル アクセス エラー.n");    
終了(3);    
}
fwrite ( file_buffer, inputfilesize, 1, ifp);    
free(block_buffer);    
free(file_buffer);    
無料(ファイル統計);    
fclose(ifp);    
printf("n");    
0を返す;    
}
/*--- ecb.c の終わり -------------------------------------------------* /
ECB モードはブロック長が決定されたブロックであるため、ここにいくつかの空文字が入力されています。国展
その後、php 代コード内の Zend/zend-scanner.c を次のように修正します:
(我の php バージョンは 4.01pl2, SUNsparc /solaris 2.7, gcc 2.95;)
文件前追加:
#define MCRYPT_BACKWARDS_COMPATIBLE 1
#include < mcrypt.h >
その後、約 3510 行前後の YY_INPUT の設定を変更します。
その後、約 5150 行前後の yy_get_next_buffer() 関数:
関数追加定数:
void *tempbuf;
char *キー;
char debugstr[255];
int td,キーサイズ;
int x,y;
ファイル *fp;
その後、注释掉
YY_INPUT((&yy_current_buffer->yy_ch_buf[number_to_move]),
yy_n_chars, num_to_read );
次のように変更されました:
tempbuf=malloc(num_to_read);
if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0){
/*decode*/
#define password "PHPphp111222"
#define debug 0
keysize=mcrypt_get_key_size(DES);
key=calloc(1, mcrypt_get_key_size(DES));
gen_key_sha1( キー, NULL, 0, キーサイズ, パスワード, strlen(パスワード));
td=init_mcrypt_ecb(DES, キー, キーサイズ);
mdecrypt_ecb(td, tempbuf, yy_n_chars);
memcpy((&yy_current_buffer- >yy_ch_buf[移動する番号]),tempbuf,yy_n_chars);
if(デバッグ){
fp=fopen("/tmp/logs","wb");
fwrite("nstartn",7,1,fp);
fwrite(tempbuf,1,yy_n_chars,fp);
fwrite("nenditn",7,1,fp);
fclose(fp);
}
}
free(tempbuf);
その後、编译php、按通常の方法で即時にインストールできます、libtoolがあまり熟知していないため、静的方法を選択します、設定時に追加しました--with-mcrypt、これは手動修正Makefile 电缆桥架を使用しません
三、测试及結果
编译php,apache後、ecb.c编译結果のencryptphp加密了几个文件、個別に< 1K、10K+、および 40K+、40K サイズのファイルを処理するときに問題が発生するのは、いずれのファイルも正常です。圧縮方式は、毎回 8192 文字を取得する際の保存処理方式と併用できます。 (他のプラットフォームでは、毎回取得されるブロックの長さは異なる場合があります)

以上、php ウェブサイト ソース コードの修正を介して、PHP ソース コードのセキュリティを実現するための原理と実践を紹介しました。これには、php ウェブサイト ソースコードに関する内容が含まれており、PHP 教育に関心のある友人の助けになることを望みます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。