簡體   English   中英

清理 PHP / CodeIgniter 4 中的字符串

[英]Sanitize strings in PHP / CodeIgniter 4

我有一個使用 CodeIgniter 4 框架在 PHP 中編程的簡單應用程序,作為一個 web 應用程序,它有一些 forms 用於用戶輸入。

我在做兩件事:

  1. 在我看來,所有來自用戶輸入的數據庫變量都使用 CodeIgniter 4 的esc() function 進行了清理。

  2. 在我的控制器中,讀取 POST 時我使用 PHP 過濾器:

    $data = trim($this->request->getPost('field', FILTER_SANITIZE_SPECIAL_CHARS)),

我不確定在從 POST 讀取數據時和打印到 HTML 時都進行清理是一個好習慣,還是應該只清理一次。

此外, FILTER_SANITIZE_SPECIAL_CHARS 沒有按我的需要工作。 我希望我的字符串字段防止用戶使用 HTML 進行攻擊,但我想保留一些換行符,我的數據庫與以前的應用程序有關。

FILTER_SANITIZE_SPECIAL_CHARS 不會刪除標簽,它只會將它們存儲在數據庫中,而不是 HTML,但它也在改變我的換行符。 是否有一個過濾器不刪除 HTML 標簽(僅使用適當的條件存儲它們)但尊重 \n 換行符?

謝謝。

不,PHP 中沒有過濾器保留 HTML 標簽,同時還保留換行符。 但是,您可以將nl2br() function 與htmlentities()結合使用,以保留換行符並正確編碼 HTML 標簽:

$data = nl2br(htmlentities(trim($this->request->getPost('field'))));

這將通過將它們轉換為<br>標記來保留用戶輸入中的換行符,同時還對 HTML 特殊字符進行編碼以防止 HTML 攻擊。

我認為對於這種情況使用 esc 就足夠了。 FILTER_SANITIZE_SPECIAL_CHARS 是一個 PHP 清理過濾器,它編碼 '"<>& 並根據標志選擇性地去除或編碼其他特殊字符。為此,您需要設置標志。它是 getPost() 方法中的第三個參數。這是一個例子

$this->request->getPost('field', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_HIGH)

可以根據您的要求更改此標志。 您可以使用任何帶有標志的 PHP 過濾器。 請參閱php 文檔了解更多信息。

暫無
暫無

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

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