簡體   English   中英

使用 psycopg2 在 Django 中保護原始 SQL 查詢

[英]Secure raw SQL query in Django with psycopg2

我正在使用 django 框架創建一個 Web 應用程序。 在其中一個 SQL 查詢中,我必須連接多個表並使用用戶輸入作為“where”子句的一部分來獲取結果。 由於查詢相當復雜,我選擇使用原始 SQL 而不是 django 框架。

查詢的簡化形式是:

select * from table where {where_clause}

where_clause將是col1>100 and col2>50 and col3 <40等形式的內容 這部分是根據用戶輸入在前端創建的(有點像股票篩選器)。

為了使查詢免受 SQL 注入的影響,我決定使用psycopg2將查詢構建為:

query = sql.SQL("select {field} from {table} where {pkey} = %s").format(
    field=sql.Identifier('my_name'),
    table=sql.Identifier('some_table'),
    pkey=sql.Identifier('id'))

即使我將where_clause所有部分都分成標識符和文字,我也不知道所有列都在那里以這種方式編寫。 用戶可能會選擇許多列進行過濾。

我怎樣才能使查詢安全?

讓用戶定義(甚至知道)您的表/列名稱一開始似乎並不安全。

我會創建一些允許值的字典,用戶可以通過該映射過濾到您的數據庫中的實際表(因此用戶不知道您的數據庫列名稱)。

然后,我不會讓用戶直接編寫“>”、“<”等運算符,而是為用戶提供一個比較運算符的下拉列表以供使用。

因此,最終用戶會向您的后端發送一個 followind 過濾器對象:

{
  “Field name 1”: {“value”: “some value”, “comparison_operator”: “greater_than”,
  “Filed name 2”: ...
}

然后在您的后端將這些值轉換為 sql where 子句

暫無
暫無

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

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