방비오2o시스템은 빠른 전자몰 구축이 필요한 이용자에게 제공되는 전자몰형 웹시스템으로, 백그라운드를 통해 웹사이트가 운영되기 때문에 가소성이 강하며, 이 시스템을 2차 개발하려면 각 프로그래머가 로컬에서 설치·사용할 수 있어야 하며, 방비개발팀이 시스템 오남용·중복 구축을 제한하기 위해 고유 도메인 제한을 가하고 있어 모순이 발생하였으므로 아래 개인별 개발경험을 참고하여 불법활동에 사용할 수 없으며, 전재처 http://blog.csdn.net/haiqiao_2010를 참고하시기 바랍니다.
고유 도메인 이름 바인딩의 원리에이비오 2o 시스템 원리
1. 프로젝트가 성공적으로 설치된 후 처음 실행되면 프로그램에서 자동으로 ~public/runtime/~core.php 파일을 생성합니다. 이 파일의 홈페이지는 현재 도메인 인증 여부를 판단하는 데 사용됩니다.
2. 파일~public/runtime/~core.php는 프로젝트에 따라 암호화된 파일 license(프로젝트 루트 아래에 위치하며, 큐브 차원이 암호화된 도메인 라이센스 파일이며, 이 파일은 사이트 런타임에 존재 여부를 판단하며, 존재하지 않을 경우 비정상적인 "domain not authorized" 즉 도메인 이름이 허가되지 않음)를 던짐으로써 복호화되어 생성됩니다. 키는 파일~system/utils/es_key.php;
3. 파일 ~ public/runtime/~core.php는 도메인 권한 부여 여부 기능뿐만 아니라 프로젝트 실행의 기본 프레임워크 파일의 로드 및 구성 역할도 담당합니다. 따라서 단순히 파일을 삭제 ~ public/runtime/~core.php는 웹 사이트를 실행할 수 없게 됩니다. 이때 이 파일을 해독하고 웹 사이트 실행의 부족한 구성을 보충해야 합니다.
큐브 2o 시스템 바인딩의 고유 도메인 이름 해독 방법
1. 웹 사이트를 실행하기 전에 파일을 생성해야 합니다. ~ public/runtime/~core.php 이 파일을 자동으로 생성하지 않도록 합니다.
2. 파일 ~ public/runtime/~core.php의 역할은 지정된 도메인 이름을 바인딩하고 프로젝트의 구조를 개선하여 프로젝트가 정상적으로 동작할 수 있도록 하는 것입니다
~ public/ runtime/ ~ core.php 파일 재작성
~ core.php 파일의 덮어쓰기, 코드는 다음과 같습니다
<?php
/*
* desc: init_checker()현재 도메인 인증 여부 감지
hyonjae domein injeung yobu gamji
*return:true or false
*/
function init_checker($str)
{
If(empty($str))
{
return false;
}
$arr = explode("|",base64_decode($str));
$arr = unserialize($arr[1]);
foreach($arr as $k=>$v)
{
$arr[$k] = base64_decode(base64_decode($v));
}
$host = $_SERVER['HTTP_HOST'];
$host = explode(":",$host);
$host = $host[0];
$passed = false;
if(!in_array($host,$arr))
{
return false;
}
return true;
}
//메소드를 호출하여 현재 도메인 이름이 허가되었는지 여부를 판단하고, 허가되지 않은 경우 이상을 던져 프로세스를 종료한다
$urldecode=" ";//암호화된 인코딩 문자열
$checker = init_checker($urldecode);
if(!$checker)die("domain not authorized");
//도메인 네임 라이선스가 통과된 후, 프로젝트의 구조를 개선하여 프로젝트가 정상적으로 운영될 수 있도록 보장합니다
//캐시 정의
require APP_ROOT_PATH.'system/cache/Cache.php';
$cache = CacheService::getInstance();
require_once APP_ROOT_PATH."system/cache/CacheFileService.php";
$fcache = new CacheFileService(); //정적 데이터 저장용 캐시 인스턴스
$fcache->set_dir(APP_ROOT_PATH."public/runtime/data/");
//end 캐시 정의
//DB 정의
require APP_ROOT_PATH.'system/db/db.php';
define('DB_PREFIX', app_conf('DB_PREFIX'));
if(!file_exists(APP_ROOT_PATH.'public/runtime/app/db_caches/'))
mkdir(APP_ROOT_PATH.'public/runtime/app/db_caches/',0777);
$pconnect = false;
$db = new mysql_db(app_conf('DB_HOST').":".app_conf('DB_PORT'), app_conf('DB_USER'),app_conf('DB_PWD'),app_conf('DB_NAME'),'utf8',$pconnect);
//end 定义DB
//템플릿 엔진 정의
require APP_ROOT_PATH.'system/template/template.php';
if(!file_exists(APP_ROOT_PATH.'public/runtime/app/tpl_caches/'))
mkdir(APP_ROOT_PATH.'public/runtime/app/tpl_caches/',0777);
if(!file_exists(APP_ROOT_PATH.'public/runtime/app/tpl_compiled/'))
mkdir(APP_ROOT_PATH.'public/runtime/app/tpl_compiled/',0777);
$tmpl = new AppTemplate;
//end 템플릿 엔진 정의
$_REQUEST = array_merge($_GET,$_POST);
filter_request($_REQUEST);
$lang = require APP_ROOT_PATH.'/app/Lang/'.app_conf("SHOP_LANG").'/lang.php';
?>
이 파일에서 변수 $urldecode는 인증된 도메인 이름 문자열을 위해 인증된 도메인 이름을 암호화하는 방법 domain_encryption()이다
/*
* desc:domain_encryption()인증된 도메인 이름을 암호화하는 방법
* param:$arr인증된 도메인 이름 또는 IP 배열
* return:$str 암호화된 도메인 이름 문자열을 반환합니다
*/
function domain_encryption($arr=array())
{
if (count($arr>0))
{
foreach ($arr as $k=>$v)
{
$domain_array[]=base64_encode(base64_encode($v));
}
}
return base64_encode(base64_encode(serialize($domain_array))."|".serialize($domain_array));
}
echo domain_encryption(array("imember.cc","localhost","127.0.0.1"));
'개발 꿀팁 > PHP' 카테고리의 다른 글
Wordpress 로그인하지 않은 사용자의 REST API 접근 금지 (0) | 2022.08.02 |
---|---|
애플릿 또는 js, 변수(Undefined String Array Object)가 비어 있는지 판단 (0) | 2022.08.02 |
10개의 실용적인 PHP 정규 표현식 (0) | 2022.08.01 |
php 영문 문자열 길이 계산 (0) | 2022.08.01 |
PHP 단순 MVC 아키텍처 (0) | 2022.08.01 |