在我的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. 驗證是否需要TCP?
- 2. SQL查詢需要時間
- 3. 驗證是否存在提交
- 4. 在提交按鈕點擊時需要驗證
- 5. 是否需要驗證函數參數?
- 6. 需要提高sql查詢的性能
- 7. Sql查詢需要
- 8. jQuery驗證未驗證提交事件是否正確
- 9. 提交驗證錯誤時發生N + 1查詢
- 10. 是否需要獨特的自定義驗證器名稱?
- 11. 是否需要同時運行交叉驗證的隨機森林
- 12. 檢查多個存儲庫中是否需要推送/提交
- 13. php mail:檢查服務器是否需要驗證?
- 14. C#WebRequest檢查頁面是否需要HTTP身份驗證
- 15. 我是否需要加入查詢的交易?
- 16. 驗證mysql查詢是否爲NULL
- 17. 在PL/SQL中運行循環時,是否需要事後提交?
- 18. 需要很長時間的SQL查詢
- 19. 需要時間的SQL Server查詢
- 20. 在SQL查詢時需要幫助
- 21. 在SQL查詢時需要幫助
- 22. SQL查詢驗證器
- 23. 需要提交
- 24. html5表單驗證(無需提交)
- 25. SQL查詢/子查詢需要幫助
- 26. 需要使用SQL查詢
- 27. SQL查詢需要幫助
- 28. SQL插入查詢需要
- 29. 需要SQL Server查詢
- 30. 需要一個SQL查詢
大概應該已經更清楚了,我的SELECT查詢不使用動態字段名稱。正如你所說,那將是愚蠢的。 – hamalnamal 2012-04-12 18:02:17