热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为PHP开发者设计,用于生成标准的PHP会话管理代码。通过精确的参数配置,可快速创建会话并设置指定名称的会话变量,确保代码符合PHP最佳实践和安全规范。适用于用户登录系统、购物车功能、表单数据处理等多种Web开发场景,提供清晰的技术文档和代码注释,帮助开发者理解会话机制的工作原理和实现细节。
<?php
declare(strict_types=1);
/**
* 用途:在“用户登录”动作完成(凭证校验通过)后安全地启动会话并初始化会话变量 auth_user。
* 兼容:PHP 8.1+(推荐 8.2/8.3)
*/
use Throwable;
/**
* 判断当前请求是否通过 HTTPS。
* 注意:若有反向代理,请在受信场景下设置环境变量 TRUST_PROXY=true,并正确透传 X-Forwarded-Proto。
*/
function is_https_request(): bool
{
if (!empty($_SERVER['HTTPS']) && strtolower((string)$_SERVER['HTTPS']) !== 'off') {
return true;
}
if (isset($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443) {
return true;
}
$trustedProxy = filter_var(getenv('TRUST_PROXY'), FILTER_VALIDATE_BOOL);
if ($trustedProxy && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
return strtolower((string)$_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https';
}
return false;
}
/**
* 获取客户端 IP(默认仅信任 REMOTE_ADDR)。
* 若位于受信反向代理之后,可开启 TRUST_PROXY,并安全使用 X-Forwarded-For 的最左侧地址。
*/
function client_ip(): string
{
$trustedProxy = filter_var(getenv('TRUST_PROXY'), FILTER_VALIDATE_BOOL);
if ($trustedProxy && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$parts = explode(',', (string)$_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($parts[0]);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
return filter_var($ip, FILTER_VALIDATE_IP) ?: '0.0.0.0';
}
/**
* 启动一个加固的 PHP 会话。
* - 使用严格模式和仅 Cookie 传递
* - 设置安全的 Cookie 参数(Secure/HttpOnly/SameSite)
* - 在 session_start 之前完成所有配置
*/
function start_secure_session(string $sessionName = 'APPSESSID'): void
{
if (headers_sent($file, $line)) {
throw new RuntimeException("Cannot start session: headers already sent at {$file}:{$line}");
}
// 加固会话行为(非废弃项)
ini_set('session.use_strict_mode', '1'); // 拒绝使用不存在/已失效的会话 ID
ini_set('session.use_only_cookies', '1'); // 仅通过 Cookie 传输会话 ID,禁用 URL 传参
ini_set('session.gc_probability', '1'); // 1% 概率触发 GC(可结合生产环境统一回收策略调整)
ini_set('session.gc_divisor', '100');
// 在 session_start 前设置 Cookie 属性
$isHttps = is_https_request();
session_set_cookie_params([
'lifetime' => 0, // 会话 Cookie,浏览器关闭即过期
'path' => '/', // 根路径有效
// 不显式设置 domain,默认绑定当前主机名,避免子域/跨域泄露
'secure' => $isHttps, // 仅 HTTPS 传输(如在本地 HTTP 环境会自动为 false)
'httponly' => true, // 禁止 JS 访问,降低 XSS 风险
'samesite' => 'Lax', // 典型登录后跳转可用;若无需跨站请求可改为 'Strict'
]);
session_name($sessionName);
if (!session_start()) {
throw new RuntimeException('Failed to start PHP session');
}
if (session_status() !== PHP_SESSION_ACTIVE) {
throw new RuntimeException('Session is not active after session_start');
}
}
/**
* 初始化 CSRF Token(若不存在)。
*/
function ensure_csrf_token(): string
{
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
/**
* 在用户完成登录后,生成新的会话 ID,并写入 auth_user 会话变量。
* 注意:
* - 先 regenerate,再写入敏感会话数据,防止会话固定(fixation)。
* - IP 字段总是使用服务端观测到的真实值,避免被外部输入伪造。
*/
function login_initialize_auth_user(): void
{
// 业务侧期望的初始值(来自后端逻辑,而非客户端输入)
$authUser = [
'uid' => 'u24491',
'roles' => ['member'],
'mfa' => false,
'login_at' => '2025-12-10T09:21:00+08:00',
'ip' => '203.0.113.8', // 将在下方用服务端观测 IP 覆盖
];
// 规范化和安全修正
$authUser['uid'] = (string)$authUser['uid'];
$authUser['roles'] = array_values(array_unique(array_map('strval', (array)$authUser['roles'])));
$authUser['mfa'] = (bool)$authUser['mfa'];
$authUser['ip'] = client_ip(); // 始终以服务端观测值为准,防止伪造
// 会话特权变更时,先旋转会话 ID(防会话固定攻击)
if (!session_regenerate_id(true)) {
throw new RuntimeException('Failed to regenerate session ID after login');
}
// 写入指定会话变量
$_SESSION['auth_user'] = $authUser;
// 可选:绑定 UA 指纹,后续请求可做一致性校验(不要强绑定 IP,移动网络/代理会导致频繁变更)
$_SESSION['ua_hash'] = hash('sha256', (string)($_SERVER['HTTP_USER_AGENT'] ?? ''));
// 准备 CSRF 防护令牌
ensure_csrf_token();
// 记录登录会话建立时间(用于会话续期策略等)
$_SESSION['logged_in_at'] = time();
}
/**
* 入口:用于“登录成功后”的控制器/处理脚本。
* - 成功:完成会话启动与变量写入,并尽快释放锁(session_write_close)。
* - 失败:返回 500,记录日志,不泄露细节。
*/
try {
$sessionName = getenv('APP_SESSION_NAME') ?: 'APPSESSID'; // 可通过环境变量自定义
start_secure_session($sessionName);
login_initialize_auth_user();
// 重要:写完尽快释放会话锁,提高并发度(避免影响后续并发请求)
session_write_close();
// 此处可继续返回业务层的登录成功响应(JSON/重定向等)
// 示例:header('Location: /dashboard'); exit;
} catch (Throwable $e) {
http_response_code(500);
header('Content-Type: application/json; charset=UTF-8');
echo json_encode(['error' => 'Internal Server Error']);
error_log('[session] ' . $e->getMessage()); // 只记录服务器日志,不向客户端暴露细节
exit;
}
会话初始化配置说明
变量设置逻辑解析
安全注意事项
常见问题解决方案
部署步骤说明
测试方法建议
性能优化提示
<?php
declare(strict_types=1);
/**
* 购物车会话启动与初始化示例
* - 启动安全的PHP会话
* - 初始化 $_SESSION['cart_items'](若不存在)
* - 提供严格的输入校验与错误处理
*
* 适用PHP 8.x(兼容PHP 7.3+ 的 SameSite 参数写法)
*/
(function (): void {
// 1) 判定是否为HTTPS,以正确设置 Cookie 的 secure 属性
$isHttps = (
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (isset($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443)
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
);
// 2) 会话Cookie参数(购物车通常需要一定的持久化时长)
$cookieLifetime = 60 * 60 * 24 * 7; // 7天
$cookieParams = [
'lifetime' => $cookieLifetime,
'path' => '/',
'domain' => '', // 留空使用当前主机,避免跨子域泄露
'secure' => $isHttps,
'httponly' => true,
'samesite' => 'Lax', // 购物车推荐 Lax;若需跨站POST回跳(如部分支付),改用 'None' 且必须HTTPS
];
// 3) 加固会话配置(需在 session_start 之前设置)
ini_set('session.use_strict_mode', '1'); // 拒绝未初始化的Session ID,缓解会话固定攻击
ini_set('session.use_only_cookies', '1'); // 禁止URL传递Session ID
ini_set('session.gc_maxlifetime', (string)$cookieLifetime); // 尝试与Cookie生命周期对齐(是否生效取决于服务器回收策略)
// 可选:自定义会话名(仅字母数字),便于区分应用
session_name('SHOPSESSID');
// 4) 安全启动会话(包含错误处理)
if (session_status() !== PHP_SESSION_ACTIVE) {
if (headers_sent($file, $line)) {
error_log("Cannot start session: headers already sent at {$file}:{$line}");
http_response_code(500);
exit('Session initialization error.');
}
session_set_cookie_params($cookieParams);
// 将 session_start 的警告提升为异常,便于统一处理
set_error_handler(static function (int $severity, string $message, string $file, int $line): bool {
throw new RuntimeException("Session start error: {$message} in {$file}:{$line}", $severity);
});
try {
if (!session_start()) {
throw new RuntimeException('session_start() returned false.');
}
} catch (Throwable $e) {
restore_error_handler();
error_log($e->getMessage());
http_response_code(500);
exit('Session initialization error.');
}
restore_error_handler();
}
// 5) 准备并校验购物车初始值(来自需求)
$initialCart = [
'items' => [
['sku' => 'BK102', 'qty' => 2],
['sku' => 'ST35', 'qty' => 1],
],
'currency' => 'CNY',
'promo' => 'NEWUSER10',
'subtotal' => 128.00,
];
// 归一化与校验,阻止无效或意外结构写入Session
$initialCart = normalizeCart($initialCart);
// 6) 初始化会话变量(若不存在或类型异常时)
if (!isset($_SESSION['cart_items']) || !is_array($_SESSION['cart_items'])) {
$_SESSION['cart_items'] = $initialCart;
}
// 7) 若本次请求不再需要读写Session,尽快释放锁,减小并发阻塞
session_write_close();
})();
/**
* 归一化/校验购物车结构
* - 校验币种、优惠码格式
* - 保证SKU与数量的有效性
* - 将小计保留两位小数
*
* @param array $cart
* @return array
* @throws InvalidArgumentException
*/
function normalizeCart(array $cart): array
{
// 币种:3位大写字母(示例:CNY、USD)
$currency = strtoupper((string)($cart['currency'] ?? ''));
if (!preg_match('/^[A-Z]{3}$/', $currency)) {
throw new InvalidArgumentException('Invalid currency code.');
}
// 优惠码:可选,限制为3~64位字母、数字、下划线或短横线
$promo = (string)($cart['promo'] ?? '');
if ($promo !== '' && !preg_match('/^[A-Z0-9_-]{3,64}$/i', $promo)) {
throw new InvalidArgumentException('Invalid promo code format.');
}
// 商品项:非空数组,每项包含有效SKU与数量
$items = $cart['items'] ?? [];
if (!is_array($items) || $items === []) {
throw new InvalidArgumentException('Cart items must be a non-empty array.');
}
$normalizedItems = [];
foreach ($items as $i => $row) {
$sku = strtoupper((string)($row['sku'] ?? ''));
if (!preg_match('/^[A-Z0-9-]{1,64}$/', $sku)) {
throw new InvalidArgumentException("Invalid SKU at index {$i}.");
}
$qty = (int)($row['qty'] ?? 0);
if ($qty < 1 || $qty > 100000) {
throw new InvalidArgumentException("Invalid quantity for SKU {$sku}.");
}
$normalizedItems[] = ['sku' => $sku, 'qty' => $qty];
}
// 小计:非负,保留两位小数(不在此计算价格,仅对输入进行规范化)
$subtotal = (float)($cart['subtotal'] ?? 0.0);
if ($subtotal < 0) {
throw new InvalidArgumentException('Subtotal cannot be negative.');
}
$subtotal = round($subtotal, 2);
return [
'items' => $normalizedItems,
'currency' => $currency,
'promo' => $promo,
'subtotal' => $subtotal,
];
}
会话初始化配置说明
变量设置逻辑解析
安全注意事项
常见问题解决方案
部署步骤说明
测试方法建议
性能优化提示
用现成模板快速搭建登录状态、购物车与多步骤表单;边看注释边改参数,几分钟完成会话配置与调试。
统一购物车与会员状态管理方案,规范团队命名和注释;降低安全风险与返工率,加速活动页与新功能上线。
用可复制的会话骨架快速起盘项目,稳定交付后台、会员中心、结算流程;在紧工期内保证质量与利润。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期