SQL 结构化查询语言

Structured Query Language。用来创建、操作、查询关系型 数据库 的语言。1970 年代发明,至今仍是数据访问事实标准。

基本操作

-- 查询
SELECT name, email FROM users WHERE id = 123;
 
-- 插入
INSERT INTO users (name, email) VALUES ('Shawn', 'shawn@example.com');
 
-- 更新
UPDATE users SET email = 'new@example.com' WHERE id = 123;
 
-- 删除
DELETE FROM users WHERE id = 123;

为什么 Security 行业要懂 SQL

  • 理解 SQL 注入 —— 历久不衰的 OWASP Top 10
  • 日志/SIEM 查询 —— 大部分 SIEM 用类 SQL 语法
  • 数据库审计 —— 看用户实际查了什么
  • 取证 —— 数据库里的证据怎么提取
  • 威胁狩猎 —— 用 SQL 在大表里找异常模式

SQL 注入(SQL Injection)简介

最经典的 Web 漏洞之一。如果应用代码这么写:

query = "SELECT * FROM users WHERE name = '" + user_input + "'"

用户输入 ' OR '1'='1 就变成:

SELECT * FROM users WHERE name = '' OR '1'='1'

返回全表用户!

更狠的注入:

'; DROP TABLE users; --

直接删表。

防御

  • 参数化查询(Prepared Statements) —— 几乎所有现代框架都支持,把数据和指令分开
  • ORM —— 用 ORM(Django/SQLAlchemy/Prisma)默认参数化
  • 输入验证 —— 但不要只靠这个(防御纵深)
  • 最小权限 —— 应用账号不应该有 DROP / DELETE 全表权限
  • WAF —— 拦截看起来像 SQL 注入的请求

SQL 跟 NoSQL

  • SQL 数据库:MySQL, PostgreSQL, Oracle, SQL Server
  • NoSQL 数据库:MongoDB(类似但语法不同), Redis, Cassandra

NoSQL 也有自己的注入(NoSQL injection),防御原理一样。

学 SQL 是 Technical Skills 的高 ROI 项目 —— 用得到的场景太多。