PHP分页场景下隐藏表单用户ID避免源码暴露的解决方案咨询
解决方案
最优快速方案:ID加密签名(改造成本最低,10分钟内即可完成)
你不需要修改现有数据库结构和核心业务逻辑,只需要在输出页面和接收请求的位置加少量代码:
- 渲染页面时用仅服务端持有的密钥对真实用户ID
$P_id做对称加密,把加密后的字符串替换原隐藏域的value - 后台
setting.php接收到参数后先解密得到真实ID,再走原有查询逻辑即可
对应的代码修改示例:
页面渲染端修改
// 提前定义好仅服务端知晓的加密密钥,不要泄露到前端 $secretKey = '你自定义的随机字符串密钥'; // 加密用户ID $encryptedPid = openssl_encrypt($P_id, 'AES-128-ECB', $secretKey); // 替换原有隐藏域的value即可,其他代码完全不用动 echo ' <div class="col-sm-6"> <div class="card h-100"> <img class="card-img-top" src="/uploads/'.$userPic['Link1'].'" height="400" width="400" alt="anotherOne"/> <div class="card-body"> <h5 class="card-title ">'.$row['first'].' '.$row['last'].'<span style="float:right;">'.$row['r'].'</span></h5> <p class="card-text">'.$row['briefDesc'].'</p> <form action="setting.php" method="GET"> <input type="hidden" name="time" value='.$tSelected.'> <input type="hidden" name="date" value='.$dSelected.'> <input type="hidden" name="idNumber" value='.$encryptedPid.'> <button type="submit" class="btn btn-primary" name="buttonSearch">See Profile</button> </form> </div> </div> </div>';
setting.php接收端修改
$secretKey = '和渲染端一致的自定义密钥'; $encryptedPid = $_GET['idNumber']; // 解密得到真实用户ID $realPid = openssl_decrypt($encryptedPid, 'AES-128-ECB', $secretKey); // 后续原有逻辑直接使用$realPid查询即可,无需其他修改
备选方案:会话存储映射(完全不暴露敏感信息)
你之前想到的关联数组生成映射的思路完全可行,落地方式如下:
- 渲染页面时生成随机无意义字符串作为映射token,将
token => 真实用户ID的对应关系存在当前访问用户的SESSION中 - 隐藏域value替换为该token,
setting.php接收到token后从SESSION中取出对应的真实ID即可,用完可销毁映射避免复用
额外安全优化
- 你当前使用GET方法提交表单,参数会直接暴露在浏览器地址栏、访问日志中,建议将表单的
method="GET"改为method="POST",后台对应将$_GET改为$_POST接收参数即可 - 无论使用哪种方案,都要在
setting.php中补充权限校验:判断当前登录的用户是否有权限查看目标用户的资料,避免越权访问漏洞
内容的提问来源于stack exchange,提问作者Dr5056732
相关产品推荐
相关产品推荐

