使用绑定参数以防止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]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值