Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于创建查询的psycopg2变量格式_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 用于创建查询的psycopg2变量格式

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,%

这并不相关,所以我只是对以下内容(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,%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 ; --"