SQL Injection

Table of Contents

1. SQL Injection

1.1. 形式

对于原始的 query:

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

用户可以通过输出 userName 生成下面的攻击:

SELECT * FROM users WHERE name = '' OR '1'='1';
SELECT * from users where name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't'
SELECT * from users where name = 'a' UNION SELECT * FROM userinfo WHERE 't' = 't'

通过使用 ";", "OR", "UNION" 等特殊字符构造 userName, 可以直接查到需要的信息.

1.2. 检测

1.2.1. escape

对用户的输入中的特殊符号进行 escape, 包含 ";","'" 等

1.2.2. 参数化的查询

SELECT * from user where userName='?'

然后通过 sql 引擎的 bind 功能把用户输入 bind 到 statement 上. 即数据库引擎并不是把用户的输入做为语句来解析

1.2.3. pattern check

检查用户的输入是否包含特殊的字符

1.2.4. 防火墙

像垃圾邮件过滤一样, 来自同一个 host 的多个失败或特殊的查询会导致该 host 被防火墙 block

Author: [email protected]
Date: 2019-12-03 Tue 00:00
Last updated: 2022-02-25 Fri 22:34

知识共享许可协议