You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中使用GET方法实现安全的数据传输?

解决方案

针对你当前GET参数明文暴露的问题,根据使用场景可以选择以下几种优化方案,安全优先级从高到低排列:

1. 优先使用服务端Session存储敏感参数

userid、pid这类和用户身份绑定的敏感参数完全不需要通过前端传输,直接存在服务端Session中即可,从根源避免参数泄露、篡改风险:

  • 用户登录/身份校验完成后,将敏感参数写入Session:
// 身份校验逻辑执行后
session_start();
$_SESSION['userid'] = 校验后的合法用户ID;
$_SESSION['pid'] = 对应的合法pid;
  • 前端a标签无需携带任何参数:
<a href="check_appointments.php">查看预约</a>
  • 目标页面直接从Session取参数:
// check_appointments.php 开头
session_start();
// 优先从Session取,不存在则拦截非法访问
if (empty($_SESSION['userid']) || empty($_SESSION['pid'])) {
    die("非法访问");
}
$userid = $_SESSION['userid'];
$pid = $_SESSION['pid'];

2. 必须通过URL传参时,做加密+签名处理

如果确实有动态参数需要跨页面传递无法存入Session,可以对参数整体加密后再放到URL中,同时加签名防止篡改:

// 通用加密函数(提前定义在公共文件中)
function encryptParam($data, $key = '自定义的复杂密钥') {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt(json_encode($data), 'aes-256-cbc', $key, 0, $iv);
    return base64_encode($iv . $encrypted);
}

// 生成链接的逻辑
$params = [
    'user' => $_GET['userid'],
    'p_id' => $_GET['pid']
];
$encryptedParams = encryptParam($params);
?>
<a href="check_appointments.php?data=<?php echo htmlspecialchars($encryptedParams) ?>">查看预约</a>

目标页面解密逻辑:

// 通用解密函数
function decryptParam($encrypted, $key = '和加密端一致的复杂密钥') {
    $encrypted = base64_decode($encrypted);
    $ivLength = openssl_cipher_iv_length('aes-256-cbc');
    $iv = substr($encrypted, 0, $ivLength);
    $encryptedData = substr($encrypted, $ivLength);
    return json_decode(openssl_decrypt($encryptedData, 'aes-256-cbc', $key, 0, $iv), true);
}

// check_appointments.php 中解密
if (empty($_GET['data'])) {
    die("非法访问");
}
$params = decryptParam($_GET['data']);
$userid = $params['user'];
$pid = $params['p_id'];

3. 非必须跳转场景改用POST请求

如果不需要保留链接分享能力,可以改用POST方式传递参数,参数会放在请求体中不会出现在URL上:

<!-- 隐藏表单 -->
<form id="appointmentForm" action="check_appointments.php" method="POST" style="display: none;">
    <input type="hidden" name="user" value="<?php echo htmlspecialchars($_GET['userid']) ?>">
    <input type="hidden" name="p_id" value="<?php echo htmlspecialchars($_GET['pid']) ?>">
</form>
<a href="javascript:void(0)" onclick="document.getElementById('appointmentForm').submit()">查看预约</a>

目标页面直接从$_POST中取参数即可。

强制安全注意事项
  • 无论使用哪种方案,必须先部署HTTPS证书,保障传输链路加密,避免中间节点抓包窃取、篡改数据
  • 所有用户输入(包括$_GET、$_POST的参数)输出到页面前必须用htmlspecialchars过滤,避免XSS注入风险
  • 服务端拿到参数后必须做权限校验,确认当前登录用户有权限操作对应参数的资源,避免越权访问

内容的提问来源于stack exchange,提问作者Nasik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:36:03