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