paginate_by_sql(原为find_by_sql)中如何避免sql 注入

本文探讨了在使用find_by_sql时如何防止SQL注入攻击的问题,并提供了一种简单有效的DRY方法:通过Base.connection.quote(value)来安全地引用参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一些不得不使用find_by_sql的场合,何如避免sql注入攻击?
简单有效DRY的方法:
where column = #{Base.connection.quote(value)}
可以尝试使用预编译语句来优化 SQL 查询性能,同时使用占位符来避免 SQL 注入攻击。改进后的代码如下所示: ```go stmt, err := db.DB().Prepare("SELECT * FROM flaws WHERE facility_id = ? " + "UNION SELECT * FROM issues WHERE facility_id = ? " + "UNION SELECT * FROM records WHERE facility_id = ? " + "UNION SELECT * FROM qualities WHERE facility_id = ? " + "UNION SELECT * FROM inspections WHERE facility_id = ? " + "LIMIT ? OFFSET ?") if err != nil { // 处理错误 } defer stmt.Close() req := make([]*Total, 0) offset := (page - 1) * pageSize limit := pageSize rows, err := stmt.Query(code, code, code, code, code, limit, offset) if err != nil { // 处理错误 } defer rows.Close() for rows.Next() { var item Total err := rows.Scan(&item) if err != nil { // 处理错误 } req = append(req, &item) } if err := rows.Err(); err != nil { // 处理错误 } res := db.Model(&Total{}).Where("facility_id = ?", code).Count(&Total{}) // 处理结果 ``` 这里我们使用了 `db.DB().Prepare()` 方法来预编译 SQL 查询语句,并使用占位符 `?` 来代替变量,从而避免SQL 注入攻击。 同时,我们也将分页查询的 `LIMIT` 和 `OFFSET` 参数移到了 SQL 查询语句中,以避免使用 `Scopes()` 方法产生额外的查询开销。在查询结果时,我们使用 `stmt.Query()` 方法来执行查询,并使用 `rows.Scan()` 方法将查询结果映射到结构体中。 最后,我们使用 `db.Model().Where().Count()` 方法来查询总记录数,并将结果返回给调用者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值