添加后台代理代码

This commit is contained in:
2026-03-15 01:27:05 +08:00
parent 11f9ac4dc1
commit ea08c9366a
5254 changed files with 721042 additions and 0 deletions

View File

@@ -0,0 +1,209 @@
<?php
/**
* PHP Session配置检查和修复脚本
* 用于排查session跨请求丢失的问题
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>Session配置检查</title>";
echo "<style>body{font-family: Arial, sans-serif; margin: 20px;} .ok{color: green;} .warning{color: orange;} .error{color: red;} table{border-collapse: collapse; width: 100%;} th,td{border: 1px solid #ddd; padding: 8px; text-align: left;} th{background-color: #f2f2f2;}</style>";
echo "</head><body>";
echo "<h1>PHP Session配置检查</h1>";
// 启动session
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
echo "<h2>基本Session信息</h2>";
echo "<table>";
echo "<tr><th>项目</th><th>值</th><th>状态</th></tr>";
echo "<tr><td>Session ID</td><td>" . session_id() . "</td><td class='ok'>正常</td></tr>";
echo "<tr><td>Session 名称</td><td>" . session_name() . "</td><td class='ok'>正常</td></tr>";
echo "<tr><td>Session 状态</td><td>" . session_status() . " (" .
(session_status() == PHP_SESSION_DISABLED ? "已禁用" :
(session_status() == PHP_SESSION_NONE ? "未启动" : "已启动")) . ")</td><td class='" .
(session_status() == PHP_SESSION_ACTIVE ? "ok" : "error") . "'>" .
(session_status() == PHP_SESSION_ACTIVE ? "正常" : "异常") . "</td></tr>";
echo "</table>";
echo "<h2>Session配置检查</h2>";
echo "<table>";
echo "<tr><th>配置项</th><th>当前值</th><th>推荐值</th><th>状态</th><th>说明</th></tr>";
$configs = [
'session.save_handler' => ['推荐' => 'files', '说明' => 'Session存储方式'],
'session.save_path' => ['推荐' => '可写目录', '说明' => 'Session文件存储路径'],
'session.use_cookies' => ['推荐' => '1', '说明' => '使用Cookie存储Session ID'],
'session.use_only_cookies' => ['推荐' => '1', '说明' => '仅使用Cookie不使用URL传递'],
'session.cookie_lifetime' => ['推荐' => '0', '说明' => 'Cookie生命周期0表示浏览器关闭时删除'],
'session.cookie_path' => ['推荐' => '/', '说明' => 'Cookie作用路径'],
'session.cookie_domain' => ['推荐' => '', '说明' => 'Cookie作用域名'],
'session.cookie_secure' => ['推荐' => 'HTTPS时为1', '说明' => '仅在HTTPS下传输Cookie'],
'session.cookie_httponly' => ['推荐' => '1', '说明' => '防止JS访问Cookie'],
'session.gc_maxlifetime' => ['推荐' => '1440', '说明' => 'Session最大生存时间'],
'session.gc_probability' => ['推荐' => '1', '说明' => '垃圾回收概率分子'],
'session.gc_divisor' => ['推荐' => '100', '说明' => '垃圾回收概率分母']
];
foreach ($configs as $config => $info) {
$value = ini_get($config);
$status = 'ok';
$statusText = '正常';
// 特殊检查逻辑
switch ($config) {
case 'session.save_path':
if (empty($value)) {
$status = 'warning';
$statusText = '使用默认路径';
} elseif (!is_writable($value)) {
$status = 'error';
$statusText = '路径不可写';
}
break;
case 'session.use_cookies':
case 'session.use_only_cookies':
case 'session.cookie_httponly':
if ($value != '1') {
$status = 'warning';
$statusText = '建议启用';
}
break;
case 'session.cookie_secure':
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
if ($isHttps && $value != '1') {
$status = 'warning';
$statusText = 'HTTPS环境建议启用';
} elseif (!$isHttps && $value == '1') {
$status = 'error';
$statusText = 'HTTP环境不应启用';
}
break;
}
echo "<tr>";
echo "<td>$config</td>";
echo "<td>$value</td>";
echo "<td>" . $info['推荐'] . "</td>";
echo "<td class='$status'>$statusText</td>";
echo "<td>" . $info['说明'] . "</td>";
echo "</tr>";
}
echo "</table>";
echo "<h2>Session目录权限检查</h2>";
$savePath = ini_get('session.save_path');
if (empty($savePath)) {
$savePath = sys_get_temp_dir();
}
echo "<table>";
echo "<tr><th>项目</th><th>值</th><th>状态</th></tr>";
echo "<tr><td>Session保存路径</td><td>$savePath</td>";
if (is_dir($savePath)) {
echo "<td class='ok'>目录存在</td>";
} else {
echo "<td class='error'>目录不存在</td>";
}
echo "</tr>";
echo "<tr><td>目录可读</td><td>" . (is_readable($savePath) ? "" : "") . "</td>";
echo "<td class='" . (is_readable($savePath) ? "ok" : "error") . "'>" . (is_readable($savePath) ? "正常" : "异常") . "</td></tr>";
echo "<tr><td>目录可写</td><td>" . (is_writable($savePath) ? "" : "") . "</td>";
echo "<td class='" . (is_writable($savePath) ? "ok" : "error") . "'>" . (is_writable($savePath) ? "正常" : "异常") . "</td></tr>";
// 检查session文件
$sessionFile = $savePath . '/sess_' . session_id();
echo "<tr><td>Session文件</td><td>$sessionFile</td>";
if (file_exists($sessionFile)) {
echo "<td class='ok'>文件存在</td>";
} else {
echo "<td class='warning'>文件不存在</td>";
}
echo "</tr>";
if (file_exists($sessionFile)) {
echo "<tr><td>Session文件大小</td><td>" . filesize($sessionFile) . " 字节</td><td class='ok'>正常</td></tr>";
echo "<tr><td>Session文件修改时间</td><td>" . date('Y-m-d H:i:s', filemtime($sessionFile)) . "</td><td class='ok'>正常</td></tr>";
}
echo "</table>";
echo "<h2>环境信息</h2>";
echo "<table>";
echo "<tr><th>项目</th><th>值</th></tr>";
echo "<tr><td>PHP版本</td><td>" . PHP_VERSION . "</td></tr>";
echo "<tr><td>操作系统</td><td>" . PHP_OS . "</td></tr>";
echo "<tr><td>服务器软件</td><td>" . ($_SERVER['SERVER_SOFTWARE'] ?? '未知') . "</td></tr>";
echo "<tr><td>文档根目录</td><td>" . ($_SERVER['DOCUMENT_ROOT'] ?? '未知') . "</td></tr>";
echo "<tr><td>当前脚本</td><td>" . ($_SERVER['SCRIPT_NAME'] ?? '未知') . "</td></tr>";
echo "<tr><td>请求方法</td><td>" . ($_SERVER['REQUEST_METHOD'] ?? '未知') . "</td></tr>";
echo "<tr><td>User Agent</td><td>" . ($_SERVER['HTTP_USER_AGENT'] ?? '未知') . "</td></tr>";
echo "</table>";
echo "<h2>Cookie信息</h2>";
echo "<table>";
echo "<tr><th>Cookie名</th><th>值</th></tr>";
if (!empty($_COOKIE)) {
foreach ($_COOKIE as $name => $value) {
echo "<tr><td>$name</td><td>" . htmlspecialchars($value) . "</td></tr>";
}
} else {
echo "<tr><td colspan='2'>没有Cookie</td></tr>";
}
echo "</table>";
echo "<h2>修复建议</h2>";
echo "<div>";
// 检查常见问题并给出建议
$hasIssues = false;
if (!is_writable($savePath)) {
echo "<p class='error'>⚠️ Session保存目录不可写需要修改目录权限</p>";
$hasIssues = true;
}
if (ini_get('session.use_cookies') != '1') {
echo "<p class='warning'>⚠️ 建议启用 session.use_cookies</p>";
$hasIssues = true;
}
if (ini_get('session.use_only_cookies') != '1') {
echo "<p class='warning'>⚠️ 建议启用 session.use_only_cookies</p>";
$hasIssues = true;
}
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
if ($isHttps && ini_get('session.cookie_secure') != '1') {
echo "<p class='warning'>⚠️ HTTPS环境建议启用 session.cookie_secure</p>";
$hasIssues = true;
}
if (!$hasIssues) {
echo "<p class='ok'>✅ 没有发现明显的配置问题</p>";
}
echo "<h3>微信登录相关建议:</h3>";
echo "<ul>";
echo "<li>确保浏览器支持Cookie并已启用</li>";
echo "<li>检查防火墙或代理是否阻止Cookie</li>";
echo "<li>确保微信授权回调的域名与设置Session的域名一致</li>";
echo "<li>检查服务器时间是否正确避免Session过期</li>";
echo "<li>在nginx/apache配置中确保正确传递Cookie</li>";
echo "</ul>";
echo "</div>";
echo "<h2>测试工具</h2>";
echo "<p>";
echo "<a href='test_session_persistence.php' target='_blank' style='margin-right: 10px; padding: 5px 10px; background: #007cba; color: white; text-decoration: none;'>Session持久化测试</a>";
echo "<a href='test_weixin_session_flow.php' target='_blank' style='margin-right: 10px; padding: 5px 10px; background: #28a745; color: white; text-decoration: none;'>微信登录流程测试</a>";
echo "<a href='debug_weixin.php' target='_blank' style='margin-right: 10px; padding: 5px 10px; background: #17a2b8; color: white; text-decoration: none;'>微信登录调试</a>";
echo "</p>";
echo "</body></html>";
?>

View File

@@ -0,0 +1,102 @@
<?php
/**
* 测试CURL CURLOPT_SAFE_UPLOAD修复
* 模拟微信API调用验证PHP8兼容性问题已解决
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "=== CURL CURLOPT_SAFE_UPLOAD 修复测试 ===\n";
// 测试CURL基本功能
if (!function_exists('curl_init')) {
echo "❌ CURL扩展未安装\n";
exit(1);
}
echo "✅ CURL扩展已安装\n";
echo "PHP版本: " . PHP_VERSION . "\n";
// 测试CURLOPT_SAFE_UPLOAD常量是否还存在
if (defined('CURLOPT_SAFE_UPLOAD')) {
echo "⚠️ CURLOPT_SAFE_UPLOAD常量仍然存在\n";
} else {
echo "✅ CURLOPT_SAFE_UPLOAD常量已被移除PHP8正常行为\n";
}
// 测试修复后的逻辑
$ch = curl_init();
echo "✅ curl_init() 成功\n";
try {
// 模拟修复后的代码逻辑
if (version_compare(phpversion(), '5.6') >= 0 && version_compare(phpversion(), '8.0') < 0) {
echo "🔧 PHP版本 < 8.0,应该设置 CURLOPT_SAFE_UPLOAD\n";
if (defined('CURLOPT_SAFE_UPLOAD')) {
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
echo "✅ 设置 CURLOPT_SAFE_UPLOAD = false 成功\n";
}
} else {
echo "✅ PHP版本 >= 8.0,跳过 CURLOPT_SAFE_UPLOAD 设置(安全上传默认启用)\n";
}
// 测试一个简单的HTTP请求
curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/get");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
echo "🔄 测试HTTP请求...\n";
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
if ($response !== false && $httpCode == 200) {
echo "✅ HTTP请求成功状态码: $httpCode\n";
echo "✅ CURL功能正常工作\n";
} else {
echo "⚠️ HTTP请求失败状态码: $httpCode\n";
if ($error) {
echo "错误信息: $error\n";
}
}
} catch (Exception $e) {
echo "❌ 测试失败: " . $e->getMessage() . "\n";
} catch (ValueError $e) {
echo "❌ PHP8 ValueError: " . $e->getMessage() . "\n";
echo "这表明CURLOPT_SAFE_UPLOAD问题仍然存在\n";
} finally {
curl_close($ch);
}
echo "\n=== 包含communication.func.php测试 ===\n";
// 测试实际的communication.func.php文件
require_once __DIR__ . '/framework/function/communication.func.php';
try {
echo "✅ communication.func.php 加载成功\n";
// 测试ihttp_get函数这会触发CURLOPT_SAFE_UPLOAD相关代码
if (function_exists('ihttp_get')) {
echo "🔄 测试ihttp_get函数...\n";
$result = ihttp_get("https://httpbin.org/get");
if ($result && is_array($result)) {
echo "✅ ihttp_get 函数工作正常\n";
} else {
echo "⚠️ ihttp_get 函数返回异常\n";
}
} else {
echo "❌ ihttp_get 函数不存在\n";
}
} catch (Exception $e) {
echo "❌ communication.func.php 测试失败: " . $e->getMessage() . "\n";
} catch (ValueError $e) {
echo "❌ communication.func.php PHP8 ValueError: " . $e->getMessage() . "\n";
}
echo "\n=== 测试完成 ===\n";
?>

View File

@@ -0,0 +1,102 @@
<?php
/**
* 测试session跨请求持久化功能
* 用于排查微信登录中session丢失问题
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>Session持久化测试</title></head><body>";
echo "<h1>Session持久化测试</h1>";
// 启动session
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
echo "<h2>当前Session信息</h2>";
echo "<p>Session ID: " . session_id() . "</p>";
echo "<p>Session 名称: " . session_name() . "</p>";
echo "<p>Session 状态: " . session_status() . "</p>";
// 检查是否有测试数据
if (isset($_GET['action'])) {
switch ($_GET['action']) {
case 'set':
// 设置测试数据
$_SESSION['test_time'] = time();
$_SESSION['test_data'] = 'Test session data - ' . date('Y-m-d H:i:s');
$_SESSION['test_counter'] = isset($_SESSION['test_counter']) ? $_SESSION['test_counter'] + 1 : 1;
echo "<p style='color: green;'>✅ Session数据已设置</p>";
break;
case 'check':
// 检查测试数据
if (isset($_SESSION['test_time'])) {
echo "<p style='color: green;'>✅ Session数据存在</p>";
echo "<p>设置时间: " . date('Y-m-d H:i:s', $_SESSION['test_time']) . "</p>";
echo "<p>测试数据: " . $_SESSION['test_data'] . "</p>";
echo "<p>访问计数: " . $_SESSION['test_counter'] . "</p>";
} else {
echo "<p style='color: red;'>❌ Session数据不存在</p>";
}
break;
case 'clear':
// 清除测试数据
unset($_SESSION['test_time']);
unset($_SESSION['test_data']);
unset($_SESSION['test_counter']);
echo "<p style='color: orange;'>🗑️ Session数据已清除</p>";
break;
}
}
echo "<h2>当前Session内容</h2>";
echo "<pre>" . print_r($_SESSION, true) . "</pre>";
echo "<h2>PHP Session配置</h2>";
echo "<table border='1' cellpadding='5'>";
echo "<tr><th>配置项</th><th>值</th></tr>";
echo "<tr><td>session.save_handler</td><td>" . ini_get('session.save_handler') . "</td></tr>";
echo "<tr><td>session.save_path</td><td>" . ini_get('session.save_path') . "</td></tr>";
echo "<tr><td>session.cookie_lifetime</td><td>" . ini_get('session.cookie_lifetime') . "</td></tr>";
echo "<tr><td>session.cookie_path</td><td>" . ini_get('session.cookie_path') . "</td></tr>";
echo "<tr><td>session.cookie_domain</td><td>" . ini_get('session.cookie_domain') . "</td></tr>";
echo "<tr><td>session.cookie_secure</td><td>" . (ini_get('session.cookie_secure') ? 'Yes' : 'No') . "</td></tr>";
echo "<tr><td>session.cookie_httponly</td><td>" . (ini_get('session.cookie_httponly') ? 'Yes' : 'No') . "</td></tr>";
echo "<tr><td>session.use_cookies</td><td>" . (ini_get('session.use_cookies') ? 'Yes' : 'No') . "</td></tr>";
echo "<tr><td>session.use_only_cookies</td><td>" . (ini_get('session.use_only_cookies') ? 'Yes' : 'No') . "</td></tr>";
echo "</table>";
echo "<h2>HTTP头信息</h2>";
echo "<pre>";
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
echo "$key: $value\n";
}
}
echo "</pre>";
echo "<h2>Cookie信息</h2>";
echo "<pre>" . print_r($_COOKIE, true) . "</pre>";
echo "<h2>操作</h2>";
echo "<p>";
echo "<a href='?action=set' style='margin-right: 10px; padding: 5px 10px; background: #007cba; color: white; text-decoration: none;'>设置Session数据</a>";
echo "<a href='?action=check' style='margin-right: 10px; padding: 5px 10px; background: #28a745; color: white; text-decoration: none;'>检查Session数据</a>";
echo "<a href='?action=clear' style='margin-right: 10px; padding: 5px 10px; background: #dc3545; color: white; text-decoration: none;'>清除Session数据</a>";
echo "<a href='?' style='margin-right: 10px; padding: 5px 10px; background: #6c757d; color: white; text-decoration: none;'>刷新页面</a>";
echo "</p>";
echo "<h2>跨请求测试</h2>";
echo "<p>1. 点击「设置Session数据」</p>";
echo "<p>2. 在新标签页中打开此页面</p>";
echo "<p>3. 点击「检查Session数据」看是否能读取到刚才设置的数据</p>";
echo "<h2>微信登录相关测试</h2>";
echo "<p><a href='debug_weixin.php' target='_blank'>查看微信登录调试信息</a></p>";
echo "</body></html>";
?>

View File

@@ -0,0 +1,96 @@
<?php
/**
* 模拟微信登录回调测试
* 测试CURLOPT_SAFE_UPLOAD修复后微信API调用是否正常
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "=== 微信登录回调CURL修复测试 ===\n";
// 模拟微信回调参数
$_GET['code'] = '091qfQ0w3Lxnd530000gA0DiBo0qfQ0E';
$_GET['state'] = 'ylsid-PHPSESSID';
// 启动session必须在任何输出之前
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// 模拟session中的登录参数
define('LOGINPARAMETER_CALLBACK', 'login_callback');
$_SESSION[LOGINPARAMETER_CALLBACK] = json_encode([
'scode' => 'test_scode_123',
'app_id' => 1,
'dev_key' => 'test_devkey',
'market_key' => 'test_market',
'return_url' => 'https://example.com/success',
'return_parameter' => '',
'fail_url' => 'https://example.com/error'
]);
echo "✅ Session参数已设置\n";
echo "Session ID: " . session_id() . "\n";
// 加载必要的文件
try {
require_once __DIR__ . '/source/login/common.php';
echo "✅ common.php 加载成功\n";
} catch (Exception $e) {
echo "❌ 加载common.php失败: " . $e->getMessage() . "\n";
}
// 测试微信API调用相关的CURL操作
try {
// 包含微信账户类
if (file_exists(__DIR__ . '/framework/class/weixin.account.class.php')) {
require_once __DIR__ . '/framework/class/weixin.account.class.php';
echo "✅ 微信账户类加载成功\n";
// 测试创建微信账户对象
$account = array();
$account["key"] = 'test_appid';
$account["secret"] = 'test_secret';
if (class_exists('WeiXinAccount')) {
$weixin = new WeiXinAccount($account);
echo "✅ 微信账户对象创建成功\n";
// 测试getOauthInfo方法这会触发CURL调用
echo "🔄 测试微信OAuth信息获取...\n";
// 注意这里会进行真实的网络请求但由于使用测试参数应该会返回错误但不应该出现CURLOPT_SAFE_UPLOAD错误
$oauth = $weixin->getOauthInfo($_GET['code']);
if (is_array($oauth)) {
echo "✅ getOauthInfo 调用成功(返回数组)\n";
if (isset($oauth['errcode'])) {
echo " 返回错误码(预期,因为使用测试参数): " . $oauth['errcode'] . "\n";
if (isset($oauth['errmsg'])) {
echo " 错误信息: " . $oauth['errmsg'] . "\n";
}
}
} else {
echo "⚠️ getOauthInfo 返回非数组结果\n";
}
} else {
echo "❌ WeiXinAccount 类不存在\n";
}
} else {
echo "❌ 微信账户类文件不存在\n";
}
} catch (ValueError $e) {
echo "❌ 发现PHP8 ValueErrorCURLOPT_SAFE_UPLOAD问题: " . $e->getMessage() . "\n";
echo "🔧 需要进一步检查CURL相关代码\n";
} catch (Exception $e) {
echo "⚠️ 其他异常: " . $e->getMessage() . "\n";
} catch (Error $e) {
echo "❌ PHP错误: " . $e->getMessage() . "\n";
}
echo "\n=== 测试完成 ===\n";
echo "如果没有看到 ValueError 关于 CURLOPT_SAFE_UPLOAD说明修复成功\n";
?>