使用绑定参数以防止SQL注入攻击
说明
日期:2025年6月6日。
有以下查询需求:
SELECT * FROM users WHERE email ='billy@gmail.com'
AND encrypted_password ='$10$WMT9Y'
web应用实现代码:
Connection connection= DriverManager. getConnection(DB_URL, DB_USER, DB_PASSWORD);
Statement statement = connection. createStatement ();
String sql ="SELECT* FROM users WHERE email='"+ email+
"'AND encrypted _password="'+ password + " " ' ;statement.executeQuery(sql);
用户传送billy@gmail.com'--
即可进行攻击,实现无密码登录:
statement .executeQuery(
"SELECT * FROM users WHERE email='billy@gmail.com'--'AND encrypted_
password= 'Z$DSA92HO'");
示例
日期:2025年6月6日。
应用:
- node.js v22.15.1
- npm v11.4.1
- sqlite3 --version:3.45.1 2024-01-30
async function queryDatabase(dbName, sql, params) {// 创建数据库连接并等待打开const db = await new Promise((resolve, reject) => {const database = new sqlite3.Database(dbName, (err) => {if (err) return reject(err);resolve(database);});});try {// 执行参数化查询const results = await new Promise((resolve, reject) => {db.all(sql, params, (err, rows) => {if (err) return reject(err);resolve(rows);});});return results;} finally {// 始终尝试关闭数据库连接await new Promise((resolve, reject) => {db.close((err) => {if (err) {console.error('Database close fail: ', err.message);reject(err);} else {resolve();}});}).catch(() => { /* 已记录错误,无需处理 */ });}
}const certNumber = '1234567';
results = await queryDatabase('CERTIFICATE.DB', 'SELECT * FROM CERTIFICATE WHERE NUM = ? LIMIT 1;', [certNumber]);