正如标题所示,我想知道这段代码是否容易受到 SQL 注入攻击?如果是这样,是否有更好、更安全的方法来实现同样的目标?
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
是的。使用类似这样的东西来防止它:
cursor.execute("INSERT INTO table VALUES ?", args)
请注意,您不能像这样输入表格。理想情况下,该表应该是硬编码的,在任何情况下都不应来自任何类型的用户输入。您可以使用与表中类似的字符串,但您最好 100% 确定用户无法以某种方式更改它......请参阅sqlite3中表名可以使用参数吗? https://stackoverflow.com/questions/5870284/can-i-use-parameters-for-the-table-name-in-sqlite3更多细节。
本质上,您希望将参数放在游标命令中,因为这将确保数据数据库的安全。使用你的第一个命令,制作一个特殊的命令会相对容易table
or args
在你的 SQL 代码中添加了一些不安全的东西。请参阅蟒蛇页面 http://docs.python.org/2/library/sqlite3.html,以及所引用的http://xkcd.com/327/ http://xkcd.com/327/。具体来说,Python 页面引用了:
通常您的 SQL 操作需要使用 Python 中的值
变量。你不应该使用 Python 的字符串来组装你的查询
操作,因为这样做不安全;它使你的程序
容易受到 SQL 注入攻击(请参阅http://xkcd.com/327/ http://xkcd.com/327/为了
可能出错的幽默例子)。
相反,请使用 DB-API 的参数替换。放 ?作为一个
在您想要使用值的任何位置使用占位符,然后提供一个元组
值作为游标的execute()方法的第二个参数。
(其他数据库模块可能使用不同的占位符,例如 %s 或
:1。)
基本上,有人可以设置一个执行另一个命令的参数,如下所示:
args="name; DELETE table"
使用cursor.execute将填充给定的值,以便参数可以如列出的那样,并且当您对其进行查询时,这正是您将得到的结果。XKCD http://xkcd.com/327/也幽默地解释了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)