参数化查询时,如何处理动态表名导致的SQL注入风险?
在开发用户数据分析功能时遇到了个难题,我需要根据用户角色动态查询不同表的数据。比如普通用户查user_data表,管理员查admin_data表。
之前用字符串拼接表名写过这样的SQL:SELECT * FROM #{tableName} WHERE id=#{userId},后来被提醒有注入风险。我改成参数化查询后:
// 使用Knex.js的参数化写法
const result = await db.from('?').where('id', userId);
但运行时却报错说”near ‘?’: syntax error”,好像参数化不支持表名占位。那这种情况该怎么安全处理动态表名呢?直接拼接字符串又怕被绕过防护…
试过把表名存在配置数组里通过索引取值,比如allowedTables[userRole].tableName,但不确定这样是否完全安全。有没有更规范的解决方案?
你这个问题挺常见的,记得一定要严格控制白名单,别偷懒。