密钥绝不能写死在代码里,应通过环境变量(首选)、Web根目录外配置文件或运行时解密加载;严禁硬编码、存数据库、放Web可访问路径或用define声明。

PHP 7.3 集成 Mistral API 时,密钥绝不能写死在代码里。核心原则是:密钥不进版本库、不暴露给 Web 请求、不在内存中长期明文驻留。下面从部署环境出发,给出可直接落地的存放方式。
用环境变量隔离密钥(推荐首选)
这是 PHP 7.3 兼容性最好、运维最轻量的方式。系统级环境变量天然不被 Web 服务器(如 Apache/Nginx)直接响应,也无需修改 PHP 配置。
- 在服务器上设置(以 Linux 为例):
echo 'export MISTRAL_API_KEY="sk-xxx"' >> /etc/profile.d/mistral.sh && source /etc/profile.d/mistral.sh - PHP 中读取:
$apiKey = getenv('MISTRAL_API_KEY') ?: $_ENV['MISTRAL_API_KEY'] ?? null; - 验证是否生效:
php -r "echo getenv('MISTRAL_API_KEY') ?: 'not set';"
Web 根目录外配置文件(适合共享主机)
当无法控制服务器环境变量时,把密钥放在 Web 不可访问路径下,再 require 加载。
- 创建配置文件(例如 /home/user/config/mistral.php):
return ['api_key' => 'sk-xxx']; - 在业务代码中加载:
$config = require '/home/user/config/mistral.php';
$client = new GuzzleHttp\Client(['headers' => ['Authorization' => 'Bearer ' . $config['api_key']]]); - 务必确认该路径不在 Nginx/Apache 的 root 或 alias 范围内,且文件权限设为 600(仅属主可读写)
运行时解密加载(高安全场景)
若密钥需应对审计或合规要求(如等保三级),建议加密存储后运行时解密。PHP 7.3 支持 OpenSSL,可用 AES-256-CBC 实现:
立即学习“PHP免费学习笔记(深入)”;
- 将密钥用固定主密钥加密后存为文件(如 /etc/app/mistral.key.enc)
- 主密钥通过环境变量传入:
$masterKey = hex2bin(getenv('MASTER_KEY')); // 32字节 - 解密逻辑示例:
$encrypted = file_get_contents('/etc/app/mistral.key.enc');
$iv = substr($encrypted, 0, 16);
$ciphertext = substr($encrypted, 16);
$apiKey = openssl_decrypt($ciphertext, 'AES-256-CBC', $masterKey, OPENSSL_RAW_DATA, $iv);
绝对要避免的操作
这些做法在 PHP 7.3 环境中已被反复验证为高危:
- 硬编码在 config.php 或控制器里(git 提交即泄露)
- 存进数据库并用简单 base64 存储(无加密等于明文)
- 放在 /public、/web 或任何能被 HTTP 直接访问到的路径下
- 用 define() 在全局脚本中声明密钥(仍会出现在 opcache 和内存 dump 中)



















