php数据库安全的核心是防止数据误用、窃取和篡改;须用预处理防sql注入,配置文件移出web根目录,密码用password_hash哈希,禁线上暴露错误细节。

PHP 数据库安全的核心,不是“防什么”,而是“怎么让数据不被误用、不被偷、不被改错”。 面试中常考的不是冷门漏洞,而是你是否真理解每一步操作背后的风险和防御逻辑。
SQL 注入:为什么预处理语句是底线,不是可选项
拼接 SQL 字符串(如 "SELECT * FROM users WHERE id = " . $_GET['id'])等于把数据库钥匙直接交给用户。即使加了 intval() 或 mysqli_real_escape_string(),也挡不住绕过技巧(比如宽字节、十六进制编码、多语句注入等)。
- 必须用 PDO 或 MySQLi 的预处理(
prepare + bindParam),参数与 SQL 结构彻底分离 - 不要自己“过滤关键词”(如屏蔽
union、select),规则永远追不上绕过手法 - 即使只查固定字段,也要预处理——因为类型、长度、上下文都可能变化
数据库连接与凭证:别让 config.php 成为突破口
把数据库账号密码写在 Web 可访问目录下的 config.php,等于把保险柜密码贴在门上。
机械设备钢材建材网站是基是一个以PHP+MySQL/Sqlite进行开发的四网合一网站源码。 系统功能特点: 四网合一企业网站管理系统支持在线升级(支持跨版本)、插件在线安装、系统内置严格的过滤体系、可以有效应对安全检测报告。 四网合一:电脑网站、手机站(数据同步、支持绑定域名)、小程序、公众号管理一个后台即可搞定。 双数据库引擎、运行环境全面:同时支持Sqlite
- 配置文件应放在 Web 根目录之外(如
/var/www/config/),或通过 Web 服务器禁止访问(Nginx 中用location ~ \.php$ { deny all; }) - 数据库账号遵循最小权限原则:普通业务账号只给
SELECT/INSERT/UPDATE,禁用DROP/CREATE/FILE/LOAD DATA - 开发环境和生产环境使用不同账号,生产账号禁用 root、空密码、弱密码
敏感数据存储:密码不是“加密”,是“抗穷举哈希”
面试官听到 “我用 md5 加密密码” 就会皱眉——md5 不是加密,不可逆但可碰撞、可彩虹表破解,且无盐值、无迭代。
立即学习“PHP免费学习笔记(深入)”;
- 必须用 PHP 原生函数
password_hash($pwd, PASSWORD_ARGON2ID)或至少PASSWORD_DEFAULT(当前为 bcrypt) - 验证统一用
password_verify($input, $hash),它自动适配算法、盐值、成本因子 - 身份证、手机号、银行卡等敏感字段,若非强业务需要,不要存;必须存则用 AES-256-GCM 等带认证的加密,并密钥严格管理(不硬编码、不存 DB)
错误信息与调试:线上环境绝不暴露数据库细节
MySQL 报错如 SQLSTATE[42000]: Syntax error or access violation: 1064... 会泄露表名、字段名、甚至数据库版本,帮攻击者画出攻击地图。
- 生产环境关闭
display_errors = Off,开启log_errors = On,错误日志不公开、不包含敏感上下文 - 自定义异常处理器中,对用户只返回泛化提示(如“系统繁忙,请稍后重试”),详细错误记日志并脱敏
- 禁用
mysql_error()、mysqli_error()等直接输出底层错误的函数










