2014-10-03 67 views
3

綁定列表PARAMS我有這樣的SQL查詢:pandas中的SQL注入;在SQLAlchemy的

sql = "select * from table where date in {dl}" 

其中D1是日期的元組。我可以通過做string.format(dl=...)然後在熊貓中使用read_sql_query來完成查詢,但是我讀到這可能導致SQL注入,因此不安全。

但是,在SQLAlchemy中似乎並沒有一個好的選擇。您似乎無法使用text()將列表傳遞給params,並且將列表轉換爲字符串會導致錯誤。我發現你可以迭代列表並逐個傳遞參數,但爲什麼有人想這樣做呢?

清理變量(刪除引號,分號等)有助於降低SQL注入的風險嗎?不能使用原始SQL字符串聽起來像是一個可怕的前景。

回答

4

您可以使用.bindparams()綁定在你的text()結構參數值:

sql = text("select * from table where date in :dl").bindparams(dl=...) 

請注意,你傳遞給dl的值必須被正確地渲染的元組。

+0

謝謝,這適用於日期元組。如果參數是一個字符串呢? 'bindparams'會不會正確地逃避這一點,並避免SQL注入的可能性? – tangfucius 2014-10-03 18:38:47

+0

@tangfucius它實際上從來沒有逃脫 - 它直接傳遞給DBAPI'execute()'作爲參數,**與數據庫處理的SQL **分開。 – univerio 2014-10-03 18:45:27

+0

太棒了!那使得它完全安全。 – tangfucius 2014-10-03 19:04:17