我有一個 Airflow DAG,它從用戶那里獲取table.
然后我在 SQL 陳述句中使用該值并在 BigQuery 中執行它。我擔心自己暴露在 SQL 注入中。
這是代碼:
sql = f"""
CREATE OR REPLACE TABLE {PROJECT}.{dataset}.{table} PARTITION BY DATE(start_time) as (
//OTHER CODE
)
"""
client = bigquery.Client()
query_job = client.query(sql)
兩者都dataset通過table氣流通過,但我擔心有人可能會通過:random_table; truncate other_tbl; --作為table論點。
我擔心上面會創建一個名為的表random_table,然后截斷現有的表。
有沒有更安全的方法來處理這些通過引數傳遞的?
我查看了 BigQuery 中的引數化查詢,但這些查詢不適用于表名。
uj5u.com熱心網友回復:
您將必須創建一個表名驗證器。我認為您可以通過在表名字串的開頭和結尾使用backticks--> `來安全地驗證。這不是 100% 的解決方案,但它適用于我嘗試的一些測驗場景。它應該像這樣作業:
# validate should look for ` at the beginning and end of your tablename
table_name = validate(f"`{project}.{dataset}.{table}`")
sql = f"""
CREATE OR REPLACE TABLE {table_name} PARTITION BY DATE(start_time) as (
//OTHER CODE
)
"""
...
注意:我建議您查看中型網站上的以下帖子以檢查bigquery sql 注入。
我查看了有關Running parameterized queries的官方檔案,遺憾的是它只涵蓋了變數的引數化,而不是表或查詢的其他字串部分。
最后一點,我建議針對此特定場景打開 BigQuery 的功能請求。
uj5u.com熱心網友回復:
一般來說,您可能應該研究一下用戶輸入的清理/驗證。這是在將輸入傳遞給 BQ 查詢之前完成的。
使用 Python,您可以在用戶輸入中查找惡意字串 - 就像truncate在您的示例中一樣 - 或使用正則運算式過濾例如包含--. 這些只是一些簡單的例子。我建議您對該主題進行更多研究;您還會在 SE 上找到很多關于該主題的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448982.html
