我在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