讲师中心 微信公众号
AI工具推荐 视频效率加速

如何通过限制查询返回行数减轻SQL注入危害?

冬芳小哥_1667

冬芳小哥_1667

发布时间:2026-07-13 18:24:51

|

260人浏览过

|

来源于php中文网

原创

LIMIT本身不能防SQL注入,真正起作用的只有参数化查询;攻击者可通过UNION SELECT、多语句等绕过LIMIT限制,因此必须对LIMIT参数强制转整型、设硬上限并配合白名单校验动态结构。

如何通过限制查询返回行数减轻sql注入危害?

LIMIT 本身不能防 SQL 注入,它只管“返回多少”,不管“语句是否被篡改”。攻击者用 UNION SELECT、INSERT、SELECT ... INTO OUTFILE 或多语句(如 ; 后接 DROP TABLE)时,LIMIT 完全无效。真正起作用的只有参数化查询 —— LIMIT 只能在参数化前提下,作为辅助手段控量、防拖库、减小危害面。

为什么直接拼接 LIMIT 参数等于开门揖盗

常见错误写法:$limit = (int)$_GET['limit']; $sql = "SELECT * FROM users LIMIT $limit";。表面看转了整型,但一旦上游没做严格校验(比如传 limit=100; DROP TABLE users),或 PHP 配置允许 register_globals 等老旧机制,就可能触发多语句执行。更隐蔽的是:整型转换不拦截负数或极大值,9223372036854775807 这类值会让 MySQL 实际返回全部数据,失去限制意义。

正确做法必须满足两个条件:

  • 所有用户输入(包括 LIMIT 值)必须走 bindValue() 或等效绑定,且显式指定类型为 PDO::PARAM_INT
  • LIMIT 值必须设硬上限(如最多 100),超出则截断或拒绝,不能依赖前端传值

不同数据库对 LIMIT 参数化的支持差异

MySQL 和 PostgreSQL 支持直接绑定 LIMIT ?,但 SQLite 会报错:near "+": syntax error 如果你写 LIMIT ? + 1。PostgreSQL 不接受负数 LIMIT,0 表示空结果集;MySQL 允许负数但会转为 0,行为不一致。这些细节不处理,上线后容易在某套环境突然崩。

MySQL数据库管理技术_MySQLi篇课件和源码
MySQL数据库管理技术_MySQLi篇课件和源码

MySQL数据库管理技术_MySQLi篇以及PDO篇课件合集!

下载

安全写法示例(PDO + MySQL):

SELECT id, name FROM users WHERE status = ? LIMIT ?

执行时:

$stmt->bindValue(1, $status, PDO::PARAM_STR);<br>$stmt->bindValue(2, min((int)$limit, 100), PDO::PARAM_INT);

表名、字段名、排序方向不能参数化,白名单是唯一解

哪怕 LIMIT 绑定了,如果代码里这样写:"ORDER BY $sort_field $sort_dir",攻击者传 sort_field=id; DROP TABLE logs 就直接中招。这类动态 SQL 片段无法用占位符,必须用白名单硬控制:

  • $allowed_tables = ['users', 'orders', 'products'],校验后再拼
  • $allowed_fields = ['id', 'name', 'created_at'],且需映射到真实字段(避免别名暴露逻辑)
  • ASC/DESC 必须从固定字符串中取,不能直接拼用户输入

最容易被忽略的点:开发常以为“只要用了 ? 就安全了”,却把表名、分页偏移量(OFFSET)、GROUP BY 字段全当变量拼进去 —— 这些地方没有占位符语法,白名单校验漏一项,整条查询就失效。

灵契少女相关攻略
《灵契少女》阴间宝箱获取攻略 《灵契少女》第一章生命之树探索攻略 《灵契少女》拉卡镇全宝箱收集攻略
《灵契少女》静寂林地全宝箱收集攻略 揭秘《灵契少女》中的冰魄秘剑 《灵契少女》幽光果分布位置一览
《灵契少女》肿胀之心技能效果分享 sql中%的含义 快速掌握sql中%的作用 mysql中%的用法 mysql通配符%使用场景
如何在PostgreSQL中使用OFFSET实现SQL分页查询功能? 如何在MySQL中利用UNION运算符合并两个SQL查询结果? 为什么MySQL在执行UNION操作时性能远低于UNION ALL?
如何在SQL中实现类似于Excel的分类汇总功能? 如何解决MySQL中GROUP BY查询结果与预期不符的问题? 如何在SQL中实现对非数值类型字段的自定义规则聚合?
MySQL中UNION与UNION ALL区别 如何在SQL中利用GROUP BY和HAVING子句过滤聚合后的数据? 如何利用SQL聚合函数快速查找表中的重复记录?
如何使用SQL聚合结果作为子查询的过滤条件? SQL如何实现对分组后的数据进行二次筛选与排序? 如何使用SQL聚合函数统计异常日志的出现频率?
为什么MySQL在执行Union操作时如果不加All会产生额外的索引压力? SQL中如何使用HAVING过滤GROUP BY的分组结果? 如何在SQL中使用分组函数进行数据清洗?
如何在SQL嵌套查询中使用集合运算符(Union/Intersect)进行过滤? 如何在PostgreSQL中使用复杂聚合函数进行分组? 为什么在SQL查询中聚合函数不能直接出现在WHERE子句里?
ThinkPHP 5.1 优化 MySQL 深分页(Deep Paging)查询【Limit】 SQL分组查询中HAVING与WHERE有什么本质区别? 为什么Navicat 15在生成ER图时无法显示字段的完整描述信息?

热门AI工具

更多
LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

3743

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

791

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

969

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

5541

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2523

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

5520

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

7201

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

970

2024.04.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.2万人学习

第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.6万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 10.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn