首页 > 解决方案 > Python 2.7(sqlite3) 到 SQL Oracle,安全变量(防止 SQL 注入)

问题描述

if instance = "PROD":
     dblink = ('db9_pub',)
elif instance = "BETA":
     dblink = ('dbq9_pub',)
elif instance = "TEST"
     dblink = ('dbt9_pub',)

#Pre-defined SQL Statements    

table1_select = ("""select * from example.table1@? """)
table1_insert = ("""insert into example.table1@? (SQL_SELECT_STATEMNT) """)

conn1 = cx_Oracle.connect(logininfo)
cursor1 = conn1.cursor()

cursor1.execute(table1_select,(dblink))
cursor1.execute(table1_insert,(dblink))

所以我即将开始编写大量需要将变量传递到 SQL 语句中的 python 脚本。有些会像发布的脚本一样更安全,有些则需要防范 SQL 注入攻击。我想了解各种可变技术的使用之间的区别以及最合适的技术。

** %s, '%s', ?, :1 在我看来都一样。为安全代码执行此操作的适当方法是什么?** 我想我已经解决了这个问题,由于我正在使用的 API,我需要 ?s。

顺便说一句,发布的脚本抛出一个错误:非法变量名/编号,所以我显然不理解这个的基本应用。

============= 编辑:我在一个页面(http://bobby-tables.com/python)上找到了这个信息,它实际上对一些人有帮助。它可以帮助我确定要使用哪个版本的占位符,但不会告诉我如何防范 SQL 注入。

标签: sqloraclepython-2.7variables

解决方案


在上面的代码中,您不能在指定 DBLink 的查询字符串中使用变量。绑定变量只允许在允许表达式的地方使用,它们永远不会被解释为数据库对象(表名、列名、函数名等)。但是,由于您似乎可以通过链式 if 语句完全控制 DBLink,因此(在这种情况下)将 DBLink 连接到查询字符串中是安全的:

if instance = "PROD":
     dblink = ('db9_pub',)
elif instance = "BETA":
     dblink = ('dbq9_pub',)
elif instance = "TEST"
     dblink = ('dbt9_pub',)

#Pre-defined SQL Statements    

table1_select = ("""select * from example.table1@%s """%(dblink))
table1_insert = ("""insert into example.table1@%s (SQL_SELECT_STATEMNT) """%(dblink))

conn1 = cx_Oracle.connect(logininfo)
cursor1 = conn1.cursor()

cursor1.execute(table1_select)
cursor1.execute(table1_insert)

推荐阅读