SQL 注入(SQL Injection)发生的原因是后端代码将用户输入的数据当做了 SQL 代码的一部分执行。
考虑以下登录代码(Java JDBC 示例):
// ❌ 错误示范:字符串拼接
String query = "SELECT * FROM users WHERE username = '" + user + "' AND password = '" + pass + "'";
statement.execute(query);
如果攻击者输入用户名为:admin' --,生成的 SQL 语句将变成:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'
由于 -- 在 SQL 中表示注释,后面的密码验证被完全忽略,攻击者无需密码即可登录。
这是防御 SQL 注入最有效的方法。数据库会将 SQL 模板和数据分开处理。
// ✅ 正确示范
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, user);
pstmt.setString(2, pass);
pstmt.executeQuery();
不要使用 root 或 sa 账号连接 Web 数据库。为应用程序创建受限的数据库账号。