在我的SQL查詢中,我從用戶填寫的表單中提交數據,如here所示,不可能使用PDO對我的列名進行參數化。這很重要,因爲查詢中的列名是根據表單中的字段名稱動態插入的。
我可以非常容易地驗證$ _POST數組中提交的列名,方法是將它們從數據庫中拉出來,然後拋出任何不匹配的列名。這對於避免SQL注入是一件好事,或者僅僅是浪費系統資源(因爲它有效地將依賴於數據庫的任何請求的執行加倍)?提交SQL查詢時是否需要驗證列名?
0
A
回答
1
這是一個很好的事情,以避免SQL注入
號
或僅僅是系統資源的浪費
號
它不是一個浪費,因爲它只是一個簡單的選擇從sys技術表。
但是,當用戶不被允許進入某些領域時,它仍然可以是某種注射。假設,如果網站管理員填寫了一個(虛擬)字段「user_role」,並且用戶可以在POST中定義它,他們可以改變他們的訪問權限。
因此,硬編碼(白名單)允許的字段是唯一可靠的方法。
,因爲它有效地加倍依賴於數據庫
男人的任何請求的執行。數據庫打算被查詢。這是他們唯一的目的。無法維持簡單的選擇查詢的數據庫是無稽之談。查詢是不同的。插入一個比10個選擇更重。您必須按質量區分查詢,而不是數量。
查詢中的列名將根據表單中的字段名動態插入。
儘管對於插入/更新查詢來說,這是非常正確的,對於SELECT來說,它是壞設計的大標誌。我可以在WHERE/ORDER BY子句中使用可變字段名稱,但是如果您必須在表名稱子句的字段集中運行,那麼您的數據庫設計肯定是錯誤的。
0
您可以對列名進行硬編碼以使其更快。您還可以緩存所拉取的表格描述,以便每次更改表格模式時都不需要更新代碼。
1
除了硬編碼列的列表,你可以通過你要允許從列查詢數據庫中的另一個表建立的列清單,如
QuerableSources
SrcTable SrcColumn DescriptToUser
SomeTable SomeColumn Column used for
AnotherTable AnotherColumn Something Else
etc.
然後,你建立例如爲用戶選擇「DescriptionToUser」內容以便於閱讀的組合框,並且您控制有效的列和表格源。
至於他們正在搜索的VALUE,DEFINITELY Scrub /清理它以防止SQL注入。
相關問題
- 1. 需要JOIN驗證的SQL查詢
- 2. 驗證是否需要TCP?
- 3. 需要JavaScript驗證和提交
- 4. SQL查詢需要時間
- 5. 查詢結束時是否需要Sp_DropServer?
- 6. 驗證之前驗證是否需要驗證?
- 7. 我需要查詢的次數。我是否需要寫另一個SQL查詢
- 8. 驗證是否存在提交
- 9. 在提交按鈕點擊時需要驗證
- 10. 是否需要輸入驗證?
- 11. 是否需要驗證$ _SERVER ['REMOTE_ADDR']?
- 12. SubmitField是否需要驗證器?
- 13. MongoDB選擇器是否需要驗證?
- 14. 是否需要驗證函數參數?
- 15. 如何立即驗證值,但僅在完整提交時檢查是否需要?
- 16. 需要提高sql查詢的性能
- 17. Sql查詢需要
- 18. jQuery驗證未驗證提交事件是否正確
- 19. 需要一個SQL查詢來列值映射到列名
- 20. 程序集的簽名是否需要進行身份驗證?
- 21. 是否需要獨特的自定義驗證器名稱?
- 22. SQL Server CE是否需要/提供「UpdateOnSubmit()」?
- 23. 提交驗證錯誤時發生N + 1查詢
- 24. 需要檢查一個sql查詢是否成功?
- 25. 是否需要同時運行交叉驗證的隨機森林
- 26. 的Python SQLite的:是提交()需要SELECT查詢?
- 27. 我是否需要驗證在Laravel中查詢數據的用途?
- 28. 檢查多個存儲庫中是否需要推送/提交
- 29. C#WebRequest檢查頁面是否需要HTTP身份驗證
- 30. 我是否需要對公共方法使用驗證檢查?
大概應該已經更清楚了,我的SELECT查詢不使用動態字段名稱。正如你所說,那將是愚蠢的。 – hamalnamal 2012-04-12 18:02:17