Files
CLOAK/lib/Cloak/SimulationRouteResolver.php
T
2026-06-16 04:58:56 +08:00

176 lines
5.6 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once __DIR__ . '/WhitelistGate.php';
require_once __DIR__ . '/FpUrlHelper.php';
require_once __DIR__ . '/RiskSecondaryGate.php';
require_once __DIR__ . '/RiskSecondaryCache.php';
require_once __DIR__ . '/RiskSecondarySession.php';
require_once __DIR__ . '/ClientIpResolver.php';
/**
* 模拟测试路由:写日志,不输出 HTML / 302
*/
class SimulationRouteResolver
{
/**
* @param array $ctx 需含 v_info, logs, config_name, reason, model
* @return array{branch:string,log_id:?int,logs:array,needs_secondary:bool}
*/
public static function dispatch(array $ctx)
{
extract($ctx, EXTR_SKIP);
if (!empty($_SESSION['cloak_whitelist_fast'])) {
return self::whitelistFpBranch($logs, $config_name ?? '');
}
if (SHOW_SITE_MODE_SWITCH == 'zp') {
return self::safeBranch($logs, $v_info);
}
$showFp = (SHOW_SITE_MODE_SWITCH == 'ip_check' && $_SESSION['check_result'] != 'false')
|| SHOW_SITE_MODE_SWITCH == 'fp';
if ($showFp) {
return self::fpOrRiskBranch($logs, $v_info, $config_name);
}
return self::safeBranch($logs, $v_info);
}
/**
* @param array $logs
*/
private static function whitelistFpBranch(array $logs, $config_name)
{
$logs['result'] = 'true';
$logs['reason'] = '';
$resolved = FpUrlHelper::resolve($config_name, true);
$logs['fp_url'] = $resolved['url'] !== '' ? $resolved['url'] : FpUrlHelper::fallbackUrl();
$log_id = write_log_db($logs);
return [
'branch' => 'fp_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
/**
* @param array $logs
*/
private static function safeBranch(array $logs, $v_info)
{
if (SHOW_SITE_MODE_SWITCH == 'zp') {
$logs['result'] = 'false';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', '正品模式');
}
$logs['fp_url'] = DB_ZP;
$log_id = write_log_db($logs);
return [
'branch' => 'safe_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
/**
* @param array $logs
*/
private static function fpOrRiskBranch(array $logs, $v_info, $config_name)
{
if (AUTO_BLACK == 'ON') {
$times = howmanytimesbyip($v_info->v_ip);
if ($times + 1 >= AUTO_BLACK_TIMES) {
write_black_list($v_info->v_ip);
}
}
if (!isset($_SESSION['visit_to_3'])) {
$_SESSION['visit_to_3'] = '1';
}
if (RiskSecondaryGate::isEnabledForRequest()) {
$cached = RiskSecondaryCache::get(ClientIpResolver::resolve());
if ($cached !== null) {
return self::fpFromRiskCache($logs, $v_info, $config_name, $cached);
}
}
if (($_SESSION['visit_to_3'] ?? '1') != '3' && RiskSecondaryGate::isEnabledForRequest()) {
$logs['result'] = 'wait';
$logs['reason'] = self::mergeReason($logs['reason'] ?? '', '二次风控检测中');
$logs['fp_url'] = '';
$log_id = write_log_db($logs);
RiskSecondarySession::markWaitLog($log_id);
return [
'branch' => 'secondary_risk',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => true,
];
}
$logs['result'] = 'true';
$logs['reason'] = '';
$resolved = FpUrlHelper::resolve($config_name, true);
$logs['fp_url'] = $resolved['url'] !== '' ? $resolved['url'] : FpUrlHelper::fallbackUrl();
$log_id = RiskSecondarySession::shouldSkipFpPageLog() ? null : write_log_db($logs);
return [
'branch' => 'fp_page',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
/**
* @param array $logs
* @param array $cached
*/
private static function fpFromRiskCache(array $logs, $v_info, $config_name, array $cached)
{
RiskSecondaryCache::applyToSession($cached);
$apiResponse = RiskSecondaryCache::toApiResponse($cached);
$logs['result'] = $apiResponse['result'] ? 'true' : 'false';
$logs['reason'] = cloak_cache_hit_log_reason($logs['result']);
$logs['fp_url'] = trim((string) ($apiResponse['link'] ?? ''));
if ($logs['fp_url'] === '') {
$logs['fp_url'] = $logs['result'] === 'true'
? FpUrlHelper::fallbackUrl()
: (defined('DB_ZP') ? (string) DB_ZP : '');
}
if ($logs['result'] === 'false') {
return self::safeBranch($logs, $v_info);
}
$log_id = RiskSecondarySession::shouldSkipFpPageLog() ? null : write_log_db($logs);
return [
'branch' => 'fp_page_cache',
'log_id' => $log_id,
'logs' => $logs,
'needs_secondary' => false,
];
}
private static function mergeReason($existing, $append)
{
$existing = trim((string) $existing);
$append = trim((string) $append);
if ($existing === '') {
return $append;
}
if ($append === '' || strpos($existing, $append) !== false) {
return $existing;
}
return $existing . '' . $append;
}
}