我正在學習如何使用SQL Alchemy,我試圖重新實作一個以前定義的API,但現在使用Python。
REST API有以下查詢引數:
REST API有以下查詢引數。
myService/v1/data?range=time:201508-01:201508-02
所以我想映射類似于field:FROM:TO的東西來過濾一個結果范圍,比如說一個日期范圍。
這就是我目前正在使用的東西:
rangeStatement = range.split(': ')
if(len(rangeStatement)==3) 。
query = query.filter(text('{} BETWEEN "{}" AND "{}") AND "{}"'.format(*rangeStatement))
因此,這將產生以下的WHERE條件:
where time BETWEEN "2015-08-01" and "2015-08-02"
我知道SQL Alchemy是一個強大的工具,可以創建像Query.filter_by(MyClass.temp)這樣的查詢,但我需要API請求盡可能的開放。
因此,我擔心有人會在range引數中傳遞類似DROP TABLE的東西,并利用text函式
uj5u.com熱心網友回復:
如果查詢是使用字串格式化構建的,那么sqlalchemy.text將不能防止SQL注入 - "注入 "將已經存在于查詢文本中。 然而,動態構建查詢并不困難,在這種情況下,通過使用getattr來獲取對列的參考。 假設你使用的是帶有模型類Foo和表foos的ORM層,你可以做到
import sqlalchemy as sa
...
col, lower, upper = 'time:2015-08-01:2015-08-02'.split(' :')
# 無論風格如何,查詢實作了一個流暢的介面,。
# 所以它們可以被反復地構建。
# Classic/1.x風格
q1 = session.query(Foo)
q1 = q1.filter(getattr(Foo, col) .between(lower, upper))
print(q1)
或者
# 2.0 style (available in v1.4 )
q2 = sa.select(Foo)
q2 = q2.where(getattr(Foo, col) .between(lower, upper))
print(q2)
各自的輸出是(引數將在執行時被系結):
SELECT foos.id AS foos_id, foos.timeAS foos_time
FROM foos
WHERE foos.time BETWEEN ? AND ?
and
SELECT foos.id, foos.time
FROM foos
WHERE foos.time BETWEEN :time_1 AND :time_2
SQLAlchemy將委托引擎使用的連接器包對值進行參考,所以你對注入的保護將和連接器包提供的保護一樣好* 。
* 一般來說,我相信正確的參考應該是對SQL注入的一個很好的防御,但是我不是足夠的專家,不能自信地指出它是100%有效的。 不過,它將比從字串中建立查詢更有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/332330.html
標籤:
上一篇:在資料的頂部插入一行列名的日名。
