我在Python中使用MySQLdb。有人告诉我,正确地创建SQL语句,避免SQL注入攻击我应该在代码是这样的:如何在Python中检查和执行SQL语句
sql = "insert into table VALUES (%s, %s, %s)"
args = var1, var2, var3
cursor.execute(sql, args)
或者:
cursor.execute("insert into table VALUES (%s, %s, %s)", var1, var2, var3)
甚至这个(这可能是错误的):
header = ('id', 'first_name', 'last_name')
values = ('12', 'bob' , 'smith' )
cursor.execute("insert into table (%s) values (%s)", (header + values))
当我用PHP编程时,我通常会将整个SQL语句存储为一个长字符串,然后执行该字符串。喜欢的东西(在PostgreSQL):
$id = db_prep_string(pg_escape_string($id ));
$first_name = db_prep_string(pg_escape_string($first_name));
$last_name = db_prep_string(pg_escape_string($last_name ));
$query = "insert into table (id, first_name, last_name) values ($id, $first_name, $last_name)"
$result = pg_query($con, $query);
$retval = pg_fetch_array($result);
其中db_prep_string
是
function db_prep_string($value) {
if(
!isset($value) ||
(is_null($value)) ||
preg_match('/^\s+$/', $value) ||
($value == '')
) {
$value = 'null';
}
else {
$value = "'$value'";
}
return $value;
}
然后进行调试,我可以简单地输出$query
查看整个SQL语句。我可以用Python做类似的事吗?换句话说,我可以将SQL语句作为字符串存储,打印出来进行调试,然后执行它吗?
我想这样做:
id = prevent_sql_injection_string(id )
first_name = prevent_sql_injection_string(first_name)
last_name = prevent_sql_injection_string(last_name )
sql = "insert into table (id, first_name, last_name) values "
sql += id + ", "
sql += first_name + ", "
sql += last_name
print sql #for debugging
cursor.execute(sql)
如果没有,那么我该怎么办视图在Python中全部的SQL语句?
奖金问题:如何在使用Python的SQL语句中输入空值?
这是使用“参数化”查询或SQL调用的。 – DOK 2012-01-15 23:16:34
如果你想输入一个空值,使用'None'。 – MRAB 2012-01-15 23:28:30
你在pgsql查询中嵌入参数以获得一个巨大的字符串?呸!即使在PHP中,您也有'pg_query_params',您可以在其中将查询与值分开。 – ThiefMaster 2012-01-15 23:38:18