我听说只要在输入名字的时候动点手脚,就能骗过藏经阁的守卫,看到所有人的秘密?
那是邪术!名为 SQL 注入。若不加防范,宗门大阵瞬间瓦解。
假设守卫的代码是这样写的:
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
如果你输入 105 OR 1=1,代码就变成了:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
因为 1=1 永远是真的,所以你会看到所有人的数据!
永远不要相信用户的输入!必须使用参数化查询(Prepared Statements)。
不要拼接字符串,而是留出位置:
-- 通用 / MySQL (?)
SELECT * FROM Users WHERE UserId = ?;
-- SQL Server (@Param)
SELECT * FROM Users WHERE UserId = @UserId;
-- Oracle (:Param)
SELECT * FROM Users WHERE UserId = :UserId;
数据库会自动将输入视为纯文本,而不是可执行的代码。