Nim中如何安全向SQLite查询添加原生字符串?
Nim SQLite 处理无单引号占位符的方案
在Nim的SQLite操作中,?占位符是专门给数据值用的,会自动转义并添加单引号,适合处理字符串、数字这类实际数据,但碰到ORDER BY的字段名、表名这类标识符就不合适了——因为会被当成字符串包裹起来,导致SQL语法错误。
解决这个问题的正确方式是用Nim sql宏提供的标识符占位符:${变量名},这类占位符不会给插入的内容加单引号,还会自动处理标识符的语法要求(比如对带特殊字符的字段名添加双引号)。
举个适配你代码的例子:
let data = db.getAllRows(sql""" SELECT name, source, uploaded_at, canonical_url, size FROM table WHERE name like ? ORDER BY ${order} DESC LIMIT ? OFFSET ? """, &"%{query}%", limit, offset)
⚠️ 注意:用${}插入标识符时,必须确保变量的内容是安全的——绝对不能直接用用户输入的任意字符串,否则会有SQL注入风险。正确的做法是先校验输入,比如限定只能从预先定义的合法字段列表里选:
# 定义允许排序的字段列表 let allowedOrderFields = {"name", "uploaded_at", "size"} # 校验输入,非法则用默认值 let safeOrder = if order in allowedOrderFields: order else: "uploaded_at" let data = db.getAllRows(sql""" SELECT name, source, uploaded_at, canonical_url, size FROM table WHERE name like ? ORDER BY ${safeOrder} DESC LIMIT ? OFFSET ? """, &"%{query}%", limit, offset)
别用手动拼接SQL字符串再传给sql()的方式,完全没有转义保护,风险极高,一定要用宏自带的占位符机制来处理。
内容的提问来源于stack exchange,提问作者Letzei
相关产品推荐
相关产品推荐

