2012-04-11 105 views
0

在我的SQL查詢中,我從用戶填寫的表單中提交數據,如here所示,不可能使用PDO對我的列名進行參數化。這很重要,因爲查詢中的列名是根據表單中的字段名稱動態插入的。

我可以非常容易地驗證$ _POST數組中提交的列名,方法是將它們從數據庫中拉出來,然後拋出任何不匹配的列名。這對於避免SQL注入是一件好事,或者僅僅是浪費系統資源(因爲它有效地將依賴於數據庫的任何請求的執行加倍)?提交SQL查詢時是否需要驗證列名?

回答

1

這是一個很好的事情,以避免SQL注入

或僅僅是系統資源的浪費

它不是一個浪費,因爲它只是一個簡單的選擇從sys技術表。

但是,當用戶不被允許進入某些領域時,它仍然可以是某種注射。假設,如果網站管理員填寫了一個(虛擬)字段「user_role」,並且用戶可以在POST中定義它,他們可以改變他們的訪問權限。

因此,硬編碼(白名單)允許的字段是唯一可靠的方法。

,因爲它有效地加倍依賴於數據庫

男人的任何請求的執行。數據庫打算被查詢。這是他們唯一的目的。無法維持簡單的選擇查詢的數據庫是無稽之談。查詢是不同的。插入一個比10個選擇更重。您必須按質量區分查詢,而不是數量。

查詢中的列名將根據表單中的字段名動態插入。

儘管對於插入/更新查詢來說,這是非常正確的,對於SELECT來說,它是壞設計的大標誌。我可以在WHERE/ORDER BY子句中使用可變字段名稱,但是如果您必須在表名稱子句的字段集中運行,那麼您的數據庫設計肯定是錯誤的。

+0

大概應該已經更清楚了,我的SELECT查詢不使用動態字段名稱。正如你所說,那將是愚蠢的。 – hamalnamal 2012-04-12 18:02:17

0

您可以對列名進行硬編碼以使其更快。您還可以緩存所拉取的表格描述,以便每次更改表格模式時都不需要更新代碼。

1

除了硬編碼列的列表,你可以通過你要允許從列查詢數據庫中的另一個表建立的列清單,如

QuerableSources 
SrcTable  SrcColumn  DescriptToUser 
SomeTable  SomeColumn  Column used for 
AnotherTable AnotherColumn Something Else 
etc. 

然後,你建立例如爲用戶選擇「DescriptionToUser」內容以便於閱讀的組合框,並且您控制有效的列和表格源。

至於他們正在搜索的VALUE,DEFINITELY Scrub /清理它以防止SQL注入。