[英]Are these SQL input parameters vulnerable to injection?
我正在使用Postgres 9.4后端的Django 1.8。 我目前正在使用django.db.connection
运行以下查询:
cursor = connection.cursor()
codes = ['01', '02'] # these are actually obtained as GET parameters
query = "SELECT number_str, bnf_id, name FROM mytable WHERE "
for i, code in enumerate(codes):
q = "(number_str ILIKE '{}%' OR name ~* '{}') "
query += q.format(code, code)
if i < len(codes)-1:
query += 'OR '
cursor.execute(query)
这可行,但是容易受到SQL注入的攻击吗?
如果是这样,是否有某种方法可以在将codes
传递到查询字符串之前对其进行转义,所以该codes
仍然可以与此正则表达式查询一起使用?
我本以为这很容易受到SQL注入的攻击,因为您从用户那里获取内容, codes
,并且在将其放入查询之前不进行检查或清理。
确保对SQL命令进行转义的更好方法是使用execute
,如下所示:
query = "SELECT number_str, bnf_id, name FROM mytable WHERE "
for i, code in enumerate(codes):
q = "(number_str ILIKE %s OR name ~* %s) "
query += q
if i < len(codes)-1:
query += 'OR '
# create an interleaved list of '<code>%', '<code>' pairs:
qcodes1 = [s + '%' for s in codes]
qcodes2 = codes
qcodes = [code for p in zip(qcodes1, qcodes2) for code in p]
cursor.execute(query, qcodes)
(注意,用逗号代替%
代替execute
)。
顺便说一句,这种查询类型的Django查询集有什么问题?
你可以使用escape_string()
从MySQLDb
库引用的字符串:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.