繁体   English   中英

这些SQL输入参数是否容易注入?

[英]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库引用的字符串:

http://mysql-python.sourceforge.net/MySQLdb.html#id5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM