第三十四回:心魔入侵

—— SQL Injection (SQL 注入)
👈 上一回:算术道法 🏠 回到大竹峰 下一回:飞升考核 👉

我听说只要在输入名字的时候动点手脚,就能骗过藏经阁的守卫,看到所有人的秘密?

那是邪术!名为 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;

数据库会自动将输入视为纯文本,而不是可执行的代码。