我有两个问题。
我明白像c.execute(" INSERT INTO?VALUES ......")之类的东西是不是没有,因为?保留用于查询,而不是列名,可以包含来自外来字符或损坏字符的任何内容,注入到其他任何内容。所以这是我的问题 -
如果我可以保证,上面的例子是否安全?只包含0-9的真实字母或实数?
如果对1的答案是肯定的,那么我可以通过取任何用户给定的字符串以某种方式执行此操作,如果它包含除字母数字字符(0-9,a-z)之外的任何内容,则拒绝它吗?我该怎么做?
例如:
str="some potentially corrupt string from the user"
If (not_alphanumeric(str)):
pass
else:
c.execute("INSERT INTO ? VALUES ...", (str,))
所以从本质上讲,如果1的答案是"是",那么我将如何编写用于条件测试的not_alphanumeric?
答案 0 :(得分:1)
您无法使用表/列名称的参数,无论其内容是什么。
插入用户指定的表名最安全的方法是检查它是否在已知有效名称列表中:
valid_tables = ["ThisTable", "ThatTable"]
if str not in valid_tables:
raise Exception("invalid table name")
如果您没有这样的已知列表,correctly quote表名作为标识符;这只需要加倍内部任何引用字符:
def sql_quote_identifier(x):
return '"' + x.replace('"', '""') + '"'
c.execute("INSERT INTO {} VALUES ...".format(sql_quote_identifier(str)), ...)
答案 1 :(得分:0)
无法回答1,但可以回答2。
要测试sting是否是字母数字,请执行以下操作:
if not str.isalnum(your_string):
# your c.execute command
else: # not necessary
pass