在Django的Func中如何放置用户输入以避免SQL注入问题
解决方案
核心逻辑:Django的Func表达式内置了参数自动转义能力,所有用户输入的动态值都不要直接拼接进template参数,而是通过官方提供的传参入口传入,框架会自动完成参数化处理,彻底避免引号报错和SQL注入风险。
推荐实现方式(最简洁)
把用户输入的symptom.name用Value包裹后,作为Func的第二个位置参数传入即可,levenshtein函数的两个参数会被自动按顺序拼接,无需自定义template:
from django.db.models import F, Func, Value lev_dist = Func( F('name'), Value(symptom.name), function='levenshtein' )
自定义template场景的安全写法
如果确实需要自定义template(比如要加额外的函数逻辑),就把动态值放到params参数中,template里用%s占位即可,params中的所有值都会被框架自动参数化:
lev_dist = Func( F('name'), function='levenshtein', template="%(function)s(%(expressions)s, %s)", params=[symptom.name] )
内容的提问来源于stack exchange,提问作者Marat Mkhitaryan
相关产品推荐
相关产品推荐

