PHP游戏网站防SQL注入的核心是使用PDO预处理语句切断用户输入与SQL的直接拼接,配合禁用模拟预处理、关闭多语句执行、严格校验输入类型与范围,并删除暴露敏感信息的phpinfo页面。

PHP游戏网站防SQL注入,核心是切断用户输入与SQL语句的直接拼接关系。只要数据和逻辑不混在一起,绝大多数注入就无法生效。尤其在游戏类站点中,搜索、分类筛选、排行榜查询、用户登录/注册等环节都是高危入口,必须逐个加固。
用PDO预处理语句代替拼接SQL
这是最根本、最有效的防御手段。所有涉及用户输入参与查询的地方——比如按游戏名搜索($_GET['q'])、按分类ID加载游戏列表($_GET['cat_id'])、统计点击次数更新clicks字段——都必须使用预处理参数绑定。
- 不要写:
$sql = "SELECT * FROM games WHERE name LIKE '%{$_GET['q']}%'"; - 要写:
$stmt = $pdo->prepare("SELECT * FROM games WHERE name LIKE ?"); $stmt->execute(['%' . $_GET['q'] . '%']); - 确保PDO连接关闭模拟预处理:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);,让数据库服务器真正执行预编译 - 禁用多语句执行:
new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]);,防止堆叠注入
严格校验和过滤输入参数
预处理不能替代输入验证。游戏网站常见参数如id、cat_id、page、sort等,类型和范围必须明确限制。
- ID类参数只接受正整数:
if (!is_numeric($_GET['id']) || (int)$_GET['id'] - 分页参数控制上限:
$page = max(1, min((int)$_GET['page'], 1000)); - 排序字段仅限白名单:
$allowed_sort = ['name', 'clicks', 'id']; $sort = in_array($_GET['sort'], $allowed_sort) ? $_GET['sort'] : 'id'; - 搜索关键词做基础清洗:
trim(strip_tags($_GET['q'])),再送入预处理语句
权限分离与最小化数据库账户
即使某处逻辑出错,也要让攻击者拿不到额外权限。游戏网站通常只需读取games、categories等表,以及对clicks字段做自增更新。
立即学习“PHP免费学习笔记(深入)”;
- 为Web应用单独创建MySQL用户,只授予
SELECT, UPDATE权限,禁用DELETE, DROP, CREATE, FILE等高危权限 - 避免使用
root或全库ALL PRIVILEGES账户连接 - 敏感操作如后台游戏上架、分类管理,应走独立管理后台,与前端用户区完全隔离
隐藏错误信息,关闭调试模式
PHP报错如果暴露SQL结构或数据库路径,会极大降低攻击门槛。游戏网站面向公众,必须屏蔽所有开发期错误输出。
- 生产环境设置:
display_errors = Off、log_errors = On,错误记入日志而非页面 - 框架或自建系统中,捕获PDO异常时不打印
$e->getMessage(),统一返回“请求失败,请稍后重试” - 检查
phpinfo()页面是否被意外发布,删除或限制访问



















