【发布时间】:2012-02-11 01:14:18
【问题描述】:
我在 Python 中使用 MySQLdb。有人告诉我,要正确创建 SQL 语句并避免 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 做类似的事情吗?换句话说,我可以将safe 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 调用。
-
如果要输入空值,请使用
None。 -
您在 pgsql 查询中嵌入了参数以获得一个巨大的字符串?呸!即使在 PHP 中,您也可以使用
pg_query_params将查询与值分开。 -
我最初认为我喜欢将 SQL 查询存储为长字符串,这样我就可以获取该字符串并手动将其作为 mysql 上的命令输入。在阅读了一些 cmets 和答案之后,似乎我应该使用带有元组和 , 符号的参数化查询(请原谅我的模糊描述)。我不介意这样做,但是调试 SQL 查询的最佳做法是什么?
-
_last_executed光标属性看起来很有希望,正如这个 SO 答案中提到的:stackoverflow.com/a/7190914/4970