php 7.2中“拖放文字内容”的加密存储本质是服务端对前端上传的文本数据进行安全加密并持久化,需分三步实现:一、规范接收(区分$_files或$_post,统一编码并过滤);二、用libsodium认证加密(密钥环境变量加载,nonce随机且不复用);三、按需存数据库(text字段+base64)或加密文件(web不可访问目录),并记录元信息。

一、接收文字内容:明确来源与格式
拖放通常触发 FormData 提交一个 File 对象(即使内容是纯文本),服务端用 $_FILES 接收;也可能是前端将拖入的文本直接通过 AJAX 发送为 JSON 字段(如 { "content": "Hello world" })。你需要先确认:
- 若走
$_FILES:用file_get_contents($_FILES['file']['tmp_name'])读取原始字节,注意检查$_FILES['file']['type']和扩展名防伪造 - 若走
$_POST['content']:直接获取字符串,但需trim()、mb_convert_encoding()统一编码(推荐 UTF-8),并过滤控制字符(如preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $content))
二、加密方案:优先用 libsodium(PHP 7.2 原生支持)
PHP 7.2 内置 sodium 扩展,默认启用,比 OpenSSL 更简洁安全,适合文本加密。它提供认证加密(AEAD),能同时防篡改和泄密。
- 生成密钥:
$key = sodium_crypto_secretbox_keygen();(32 字节,必须安全保管) - 生成随机 nonce:
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);(24 字节) - 加密:
$ciphertext = sodium_crypto_secretbox($content, $nonce, $key); - 存储组合:
$stored = base64_encode($nonce . $ciphertext);(或存为两字段:nonce + ciphertext)
密钥绝不能硬编码。建议从环境变量加载:$key = base64_decode(getenv('TEXT_ENC_KEY'));,密钥本身用 sodium_bin2base64($key) 生成并安全保存在服务器配置中。
三、存储方式:按场景选数据库 or 加密文件
文字内容量不大(一般 ≤1MB),推荐存数据库;若需保留原始结构或做全文检索,可加密后存文件,再记录路径。
-
存数据库:字段类型用
TEXT或MEDIUMTEXT(UTF8MB4),插入前确保已 base64 编码。避免用VARCHAR存二进制,易截断 -
存加密文件:用
file_put_contents('data/' . uniqid() . '.enc', $nonce . $ciphertext);,文件目录禁止 Web 直接访问(如放在../private/下) - 无论哪种方式,都应记录元信息:原始长度、编码、提交时间、用户 ID(用于权限控制)
sodium_crypto_secretbox_open() 会自动失败返回 false),且每次加密必须用新 nonce —— 复用 nonce 会导致完全丧失安全性。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











