Python 用于创建查询的psycopg2变量格式
这并不相关,所以我只是对以下内容(Python 2.7)感到好奇: 我刚开始使用psycopg并通读文档,它们总是使用字符串(%s)和元组向查询传递值 变量占位符必须始终为%s 所以考虑下面的例子- 在一个名为“test”的表中,字段为value_1(varchar)和value_2(int),创建的查询如下:Python 用于创建查询的psycopg2变量格式,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,这并不相关,所以我只是对以下内容(Python 2.7)感到好奇: 我刚开始使用psycopg并通读文档,它们总是使用字符串(%s)和元组向查询传递值 变量占位符必须始终为%s 所以考虑下面的例子- 在一个名为“test”的表中,字段为value_1(varchar)和value_2(int),创建的查询如下: value_1 = "test" value_2 = "100" cur.execute("INSERT INTO test (value_1,value_2) VALUES (%s,%
value_1 = "test"
value_2 = "100"
cur.execute("INSERT INTO test (value_1,value_2) VALUES (%s,%s)",\
(value_1,value_2))
我的问题是,使用“格式”方法是否是一种不好的做法,甚至是有问题的做法(如下所示):
根据你的经验,你认为这真的很危险还是有问题?电话
cur.execute("INSERT INTO test (value_1,value_2) VALUES (%s,%s)",\
(value_1,value_2))
具有一个字符串参数和一个附加参数,该参数是替换值的元组。
这允许psycopg2
插值,并且比简单的字符串插值更安全
说
&尖锐的;传递数据以填充查询占位符,并让Psycopg执行
&尖锐的;正确的转换(不再进行SQL注入!)
>>>当前执行(“插入测试(数值,数据)值(%s,%s)”,…(100,“abc'def”))
在通话中
cur.execute("INSERT INTO test (value_1,value_2) VALUES ('{value1}',{value2})".\
format(value1=value_1,value2=value_2))
您自己对值进行插值,并将结果字符串传递给cursor execute方法
简单的插值容易受到SQL注入的影响。使用第一种形式可能会更好
<>你应该一直考虑.< /p> 在阅读了一些文档和源码之后,自己测试一下,把它弄清楚了。 答案很简单:这是非常不安全的。不仅适用于psycopg2,也适用于任何db模块(至少适用于我测试过的那些模块)。 与psycopg2相关,使用(%s),(变量,)允许psycopg2自动转义这些变量,以防止出现这种混乱 我的测试旨在找出它可能造成的小混乱:
cur.execute("INSERT INTO test (value_1,value_2) VALUES ('{value1}','{value2}')".\
format(value1=value_1,value2='1); drop table test; --killer instinct'))
就是这样,adiós测试表:-p是的,Psycopg2对所有类型使用%s,Psycopg2将参数转换为其字符串表示形式,并在查询中使用它
INSERT INTO test (value_1,value_2) VALUES('test','100');
有时您可能需要将一些值强制转换为适当的类型
cur.execute("""INSERT INTO test (value_1,value_2)
VALUES (%s,%s::integer)""",
(value_1,value_2))
您提出的方法是非常糟糕的做法,您已经为几个可能的值_1和值_2进行了sql注入。例如:
value_1="',0); rollback; drop table test ; --"
value_1="',0); rollback; drop table test ; --"