防范SQL注入的SQL语句编写_严格限制SQL命令执行

秋浩姑娘_9199

秋浩姑娘_9199

2026-04-04

1018人浏览

原创

SQL注入本质是字符串拼接而非语法问题,根本原因是用户输入被直接拼入SQL语句;必须对所有用户可控输入使用参数化查询,禁用+、format、f-string等拼接方式,动态结构(如表名、列名)需白名单校验,ORM非绝对安全,存储过程等内部SQL同样需防护。

防范sql注入的sql语句编写_严格限制sql命令执行

SQL注入本质是拼接,不是语法问题

SQL注入能生效,根本原因不是用户输入了特殊字符,而是程序把用户输入直接拼进了SQL字符串里。哪怕只用SELECT,只要用了字符串拼接,照样中招。

常见错误现象:WHERE name = ' + user_input + ' 这种写法,不管后端用Python、Java还是PHP,只要没走参数化,就等于给攻击者开了门。

  • 永远别用string.format()、+、f-string拼SQL查询条件
  • 所有用户可控的值——包括URL参数、表单字段、请求头、Cookie——都必须进参数占位符
  • 数据库驱动层(如psycopg2、mysql-connector-python、sqlite3)原生支持%s或?占位符,就用它,别自己“转义”

预编译语句 ≠ 自动防注入

很多开发者以为用了PreparedStatement(Java)或cursor.execute(sql, params)(Python)就万事大吉,其实不然:参数只能替代**值**,不能替代**结构**。

使用场景:动态表名、列名、ORDER BY字段、LIMIT偏移量——这些都不能用参数化,必须白名单校验。

  • SELECT * FROM ? 是非法的,? 不能代入表名
  • ORDER BY ? 在多数驱动里也不被允许,得靠if/else或查配置映射到固定字段名
  • 如果真要动态列名,先查白名单:if column_name not in ['created_at', 'status', 'score']: 就直接拒掉

ORM不是免死金牌,filter()也能翻车

Django的filter(name__icontains=user_input)、SQLAlchemy的.filter(User.name.contains(user_input)) 是安全的;但一旦混进extra()、raw()、text(),防线立刻崩塌。

AIHub
AIHub

一款AI开发辅助工具,主要用于一站式人工智能工具集合网站,收录了国内外1500+AI工具和网站,每日持续更新,适合需要提升相关任务效率的用户。

下载

错误示例:User.objects.extra(where=["name LIKE '%" + keyword + "%'"]) —— 这和手拼SQL毫无区别。

  • Django raw() 和 extra() 必须确保所有变量都来自可信上下文,否则一律禁用
  • SQLAlchemy 的 text("SELECT * FROM users WHERE name = :name") 是安全的,但 text(f"SELECT * FROM {table_name}") 不行
  • 任何ORM都挡不住os.system()或subprocess.run()调用psql命令这种操作——这是另一条攻击路径

LIKE查询的通配符要单独处理

LIKE本身不导致注入,但用户输入里的%、_会被当通配符用,造成逻辑绕过或误匹配;更麻烦的是,有人会故意输%admin%来模糊搜管理员账号。

这不是SQL注入,但属于输入滥用,需要和注入一起防御。

  • 若业务允许模糊搜索,对用户输入做escape并声明转义符:WHERE name LIKE %s ESCAPE '\',然后把%替换成\%
  • 不要用replace('%', '\%')这种粗暴方式,得用驱动提供的escape机制,否则可能漏掉[\]本身
  • 如果只是精确匹配,就别用LIKE,改用=,避免引入额外复杂度

最易被忽略的一点:存储过程、触发器、视图里如果拼了用户输入,哪怕调用方用了参数化,也照旧中招。SQL注入的战场不在应用层入口,而在每一个执行SQL的地方。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql语句

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.12

4643

8

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

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

2023.10.27

951

4

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

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

2024.02.23

1229

5

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

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

2024.03.06

6641

10

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

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

2024.03.06

3383

4

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

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

2024.04.07

6620

11

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

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

2024.04.29

9101

6

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

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

2024.04.29

1230

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PDO数据库抽象层
PDO数据库抽象层

共7课时 | 3.3万人学习