我在Python中有一个查询字符串,如下所示:
query = "select name from company where id = 13 order by name;"
我希望能够动态更改id
。因此,我想找到id = 13
并将其替换为新的ID。
我可以这样做:
query.replace("id = 13", "id = {}".format(some_new_id))
但如果查询中包含id= 13
或id=13
或id =13
,...
则无效。
如何避免?
答案 0 :(得分:1)
将变量直接粘贴到查询中会使您容易受到SQL注入的攻击。</ p>
如果要将查询传递给要在数据库中执行的函数,则该函数应接受其他参数。
例如,
query = "select name from company where id = %s order by name"
cursor.execute(query, params=(some_other_id,))
答案 1 :(得分:0)
最好使用格式化的sql。
<强>实施例强>
query = "select name from company where id = %s order by name;".
cursor.execute(query, (id,))
答案 2 :(得分:0)
动态构建字符串的常用解决方案是字符串格式化,即
tpl = "Hello {name}, how are you"
for name in ("little", "bobby", "table"):
print(tpl.format(name))
但是(这是一个很大的“但是”):你 NOT 想要为SQL查询执行此操作(假设您要使用此查询将此查询传递给您的数据库你的db的python api)。
在这里不使用字符串格式有两个原因:第一个是正确处理引用和转义是最棘手的,第二个也是更重要的一个是it makes your code vulnerable to SQL injections attacks。
所以在这种情况下,正确的解决方案是use prepared statements instead:
# assuming MySQL which uses "%" as placeholder,
# consult your db-api module's documentation for
# the proper placeholder
sql = "select name from company where id=%s order by name"
cursor = yourdbconnection.cursor()
cursor.execute(sql, [your_id_here])