如何防范SQL注入攻击_在数据库层配置敏感数据视图

夏晨同学_6953

夏晨同学_6953

2026-03-21

575人浏览

原创

数据库视图无法防止sql注入,因其仅封装select逻辑,不阻止字符串拼接漏洞;真正防护需参数化查询与最小权限原则,并在视图中固化敏感字段脱敏逻辑。

如何防范sql注入攻击_在数据库层配置敏感数据视图

SQL注入靠数据库视图防不住

数据库视图本身不提供SQL注入防护能力。视图只是封装了SELECT语句的逻辑层,如果上层应用拼接字符串构造查询(比如"SELECT * FROM user_view WHERE name = '" + userInput + "'"),攻击者照样能闭合引号、注入UNION SELECT或执行恶意子查询。视图甚至可能放大风险——比如一个视图底层JOIN了多张表,攻击者通过视图注入后能间接拖出更多敏感字段。

真正起效的是参数化查询 + 权限隔离

防范SQL注入必须在应用层用参数化机制,同时配合数据库账号最小权限原则。视图只该作为权限控制的辅助手段,而非“防注入工具”。

  • 应用代码中必须使用PreparedStatement(Java)、pg_query_params()(PHP/PDO)、cursor.execute("SELECT ... WHERE id = %s", [user_id])(Python/psycopg2)这类带占位符的接口,绝不用+或f-string拼接SQL
  • 连接数据库的应用账号不能拥有CREATE、DROP、EXECUTE等高危权限,也不该有对原始表的SELECT权限
  • 可创建只读视图(如user_safe_view),然后把应用账号的SELECT权限仅授予该视图,不给底层表权限——这防的是越权查数据,不是防注入

敏感字段脱敏必须在视图定义里做,不能靠应用层“忘记处理”

如果业务要求身份证号、手机号等字段在查询结果中自动掩码(比如显示为138****1234),这个逻辑必须固化在视图的SELECT语句里,而不是指望开发每次写SQL都手动调用CONCAT或REGEXP_REPLACE。

例如 PostgreSQL 中定义视图:

CREATE VIEW user_safe_view AS
SELECT id,
       username,
       REGEXP_REPLACE(phone, '(\d{3})\d{4}(\d{4})', '\1****\2') AS phone,
       created_at
FROM users;

这样即使应用误用了SELECT * FROM user_safe_view,敏感字段也已脱敏。但注意:REGEXP_REPLACE在 MySQL 8.0+ 才支持,MySQL 5.7 需改用CONCAT+SUBSTRING;SQL Server 要用STUFF函数。不同数据库语法差异大,别直接抄。

视图加WHERE条件过滤用户数据时,小心硬编码失效

有些团队想用视图实现“租户隔离”,比如定义CREATE VIEW my_tenant_data AS SELECT * FROM orders WHERE tenant_id = 123。问题在于:这个123是写死的,无法适配多租户动态场景。一旦换成变量(如CURRENT_USER或SESSION_CONTEXT),多数数据库不支持在视图里用运行时变量——PostgreSQL 的current_setting()需配合SET命令提前设值,SQL Server 的SESSION_CONTEXT()要搭配WITH SCHEMABINDING且不支持所有函数。

更可靠的做法是:用行级安全策略(RLS),比如 PostgreSQL 的CREATE POLICY,或 SQL Server 的SECURITY POLICY。视图在这里只适合做静态、确定的字段裁剪或脱敏,别让它承担动态过滤责任。

复杂点在于:RLS规则和视图定义会叠加生效,调试时容易搞不清哪一层拦住了数据。上线前务必用实际账号连库测SELECT * FROM user_safe_view,别只在DBA账号下验证。

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

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

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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

4163

8

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

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

2023.10.27

891

4

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

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

2024.02.23

1089

5

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

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

2024.03.06

6061

10

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

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

2024.03.06

2943

4

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

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

2024.04.07

6040

11

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

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

2024.04.29

8101

6

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

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

2024.04.29

1110

5

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

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

2024.04.29

972

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习