簡體   English   中英

何時使用filter_input()

[英]When to use filter_input()

這個問題最初是在這里的評論中提出的。

如果您在打印任何用戶提供的數據之前使用參數化查詢和htmlspecialchars() ,仍然需要filter_input()嗎?

對我來說似乎沒必要,但我總是被告知“過濾輸入,逃避輸出”。 因此,除了數據庫(或其他形式的存儲)之外,是否還需要過濾輸入的數據?

那么,會有不同的意見。

我的看法是你應該總是使用它(或者,通常使用filter擴展)。 至少有三個原因:

  1. 消毒輸入是你應該經常做的事情。 由於該功能為您提供了此功能,因此沒有理由找到其他方法來消毒輸入。 由於它是一個擴展,過濾器也將比大多數PHP解決方案更快,更可能更安全,這當然不會受到傷害。 唯一的例外是如果您需要更專業的過濾器。 即便如此,您仍應使用FILTER_UNSAFE_RAW過濾器獲取值(請參閱#3)。

  2. filter擴展中有很多好東西。 它可以節省您編寫清理和驗證代碼的時間。 當然,它並不涵蓋每一個案例,但足以讓您可以更專注於特定的過濾/驗證代碼。

  3. 在調試/審核代碼時,使用該函數非常有用。 使用該功能時,您確切知道輸入的內容。 例如,如果您使用FILTER_SANITIZE_NUMBER_INT過濾器,那么您可以確定輸入將是一個數字 - 沒有SQL注入,沒有HTML或Javascript代碼等。另一方面,如果您使用類似FILTER_UNSAFE_RAW東西,那么您知道它應該小心對待,並且它很容易引起安全問題。

正如Sverri M. Olsen所說,對此有不同的看法。

我非常同意濾波器輸入,轉義輸出這一理念。

如果在打印任何用戶提供的數據之前使用參數化查詢和htmlspecialchars(),仍然需要filter_input()嗎?

簡短回答: IMO,不是。這沒有必要,但在某些情況下可能有用。


filter_input函數有許多有用的過濾器,我確實使用了其中的一些(即FILTER_VALIDATE_EMAIL)。 驗證過濾器驗證輸入很有用。 但是,IMO, 轉換數據的那些只應該用於輸出。

有些人鼓勵逃避投入。 實際上, filter_input手冊頁上給出的示例似乎也鼓勵了這一點。

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);

唯一的例子是逃避 結合函數名稱(filter_ input )似乎表明轉換輸入是一種很好的做法。 轉義是必要的,但IMO應該在輸出之前完成,而不是在輸入之前完成。 至少返回值存儲在適當命名的變量中。

我強烈不同意逃避輸入 我已經遇到過現實情況,過早轉換數據是一個問題。

例如,Google Analytics處理輸入的方式會導致我的編碼&符號(%26)在排除查詢參數之前被解碼。 結果是我的查詢參數的統計信息實際上甚至不存在於我的URL中。 請參閱關於此問題的問題仍未解決。

您可能還想閱讀為什么轉義輸入是一個壞主意 以下是我同意的一些摘錄,以防文章消失[強調原文]。

[...] escape-on-input 是錯誤的 [...]它是一個分層違規 - 它將輸出格式問題混合到輸入處理中。 分層違規會使您的代碼更難理解和維護,因為您必須考慮其他層而不是讓每個組件和層執行自己的工作。

您默認損壞了數據。 該系統現在正在說明數據的來源。

轉換輸出不僅無法處理多個輸出的問題,實際上會使許多輸出的數據不正確

PHP曾經有一個名為魔術引號的功能。 這是一個輸入逃逸的功能,引起了各種各樣的問題。 [...]根據Lerdorf的說法,更新的PHP'過濾器'擴展名是“magic_quotes right right”。 但它仍然受到這里描述的幾乎所有問題的困擾。

那么濾波器擴展如何比魔術引號更好(除了它有許多不同的濾波器這一事實)? 過濾器導致許多與魔術引號相同的問題。


以下是我使用的編碼約定:

  • $ _POST,$ _GET,$ _REQUEST等中的值不應被轉義,應始終被視為不安全
  • 值應在寫入數據庫或存儲在$ _SESSION之前驗證1
  • 在寫入數據庫或存儲在$ _SESSION之前,應該清除預期為數字或布爾值的值2
  • 相信數據庫和$ _SESSION中的數值和布爾值確實是數字或布爾值
  • 在直接用於任何SQL查詢之前,字符串值應該是SQL轉義的(非字符串值應該被清理2 )或使用預准備語句
  • 字符串值在用於HTML輸出之前應該進行HTML轉義(非字符串值應該被清理2
  • 字符串值在用於查詢字符串之前應進行百分比編碼(非字符串值應該被清理2
  • 使用變量命名約定(例如* _url,* _html,* _sql)來存儲轉換后的數據

術語

就我的目的而言,這是我定義上面使用的術語的方式。

  1. 驗證意味着確認對數據做出的任何假設,例如具有特定格式或具有值的必需字段
  2. 清理意味着確認值完全符合預期(即$ id_num應該只包含數字)

摘要

一般來說(可能有一些例外),我建議如下:

  • 輸入上使用驗證過濾器
  • 輸出上使用清理過濾器
  • 記住TIMTOWDI - 例如, 我更喜歡htmlspecialchars() (有更多選項)而不是FILTER_SANITIZE_FULL_SPECIAL_CHARS或FILTER_SANITIZE_SPECIAL_CHARS(它會逃脫換行符)

暫無
暫無

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

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