簡體   English   中英

使用表名 Python 防止 SQL 在 BigQuery 中注入

[英]Prevent SQL Injection in BigQuery with Python for table name

我有一個 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)

datasettable都通過 airflow 傳遞,但我擔心有人會通過類似: random_table; truncate other_tbl; -- random_table; truncate other_tbl; -- random_table; truncate other_tbl; --作為table參數。

我擔心上面會創建一個名為random_table的表,然后截斷現有表。

有沒有更安全的方法來處理通過 arguments 傳遞的這些?

我研究了 BigQuery 中的參數化查詢,但這些查詢不適用於表名。

您將必須創建一個表名驗證器。 我認為您可以通過在表名字符串的開頭和結尾使用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
        )
        """
...

注意:我建議您在 medium 站點上查看以下帖子以檢查bigquery sql 注入

我檢查了關於運行參數化查詢的官方文檔,遺憾的是它只涵蓋了變量的參數化而不是表或查詢的其他字符串部分。

最后一點,我建議為這個特定場景打開 BigQuery 的功能請求

一般來說,您可能應該研究用戶輸入的清理/驗證。 這是在將輸入傳遞給 BQ 查詢之前完成的。

使用 Python,您可以在用戶輸入中查找惡意字符串 - 如示例中的truncate - 或使用正則表達式過濾例如包含--的輸入。 這些只是一些簡單的例子。 我建議您對該主題進行更多研究; 您還會在 SE 上找到很多關於該主題的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM