php防止sql注入的核心是使用pdo或mysqli预处理语句绑定参数,实现sql逻辑与用户数据彻底分离;辅以输入类型验证、数据库最小权限、错误信息脱敏及php运行时安全配置。

PHP脚本在Apache中防止SQL注入,核心不在Apache配置本身,而在于PHP代码层的安全实践。Apache只是Web服务器,它不解析SQL,也不参与数据库交互;真正执行查询的是PHP脚本连接数据库的过程。因此,防护重点是:用好预处理语句、严格校验输入、限制数据库权限,并辅以基础的PHP运行时安全配置。
用PDO或MySQLi预处理语句绑定参数
这是唯一被广泛验证能从根本上阻断SQL注入的方法。数据库先编译SQL结构,再把用户数据作为纯值传入,彻底分离逻辑与数据。
- 使用PDO时,务必禁用模拟预处理:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false),避免字符集不匹配导致的宽字节绕过 - 占位符只用于值,不能用于表名、字段名或ORDER BY子句;这些必须通过白名单硬编码或
in_array()校验,例如:$sort = in_array($_GET['sort'], ['name', 'created_at']) ? $_GET['sort'] : 'id'; - LIKE查询中通配符(%、_)要在PHP中拼接,不可写进SQL模板右侧,如:
$stmt->execute(["%{$_POST['kw']}%"])
对所有用户输入做类型化验证和过滤
不要依赖“看起来像”——要强制确认数据符合预期格式和范围,早拦截、早拒绝。
- 整数ID类参数直接转为int:
$id = (int)$_GET['id'];或用filter_var($_GET['id'], FILTER_VALIDATE_INT) - 邮箱、URL、IP等用内置过滤器:
filter_var($email, FILTER_VALIDATE_EMAIL),失败即终止流程 - 自由文本内容暂不入库前,可用
trim()去首尾空格、strlen()限长(如标题≤100字)、mb_substr()防超长截断
数据库账号最小权限 + PHP错误脱敏
即使注入得手,也要让它干不了坏事;同时不让攻击者从报错里读到表结构或路径信息。
- 为应用单独创建数据库用户,仅授予
SELECT、INSERT、UPDATE、DELETE,明确禁用DROP、CREATE、ALTER、LOAD_FILE等高危权限 - 生产环境关闭PHP错误显示:
display_errors = Off(在php.ini中),并设log_errors = On记录到日志文件 - 捕获异常时不暴露SQL细节,例如PDO异常中只返回“操作失败”,不输出
$e->getMessage()
Apache与PHP层面的辅助加固
这部分不防SQL注入本身,但能提升整体攻击门槛,减少被利用的路径。
- 确保
php.ini中magic_quotes_gpc为Off(已废弃,开启反而可能引发双转义漏洞) - 启用
open_basedir限制PHP脚本能访问的目录,防止恶意脚本读取配置文件:open_basedir = /var/www/html:/tmp - 禁用危险函数(如
system、exec、shell_exec),在php.ini中设置:disable_functions = system,exec,passthru,shell_exec,phpinfo
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











