[英]Sanitize strings in PHP / CodeIgniter 4
我有一個使用 CodeIgniter 4 框架在 PHP 中編程的簡單應用程序,作為一個 web 應用程序,它有一些 forms 用於用戶輸入。
我在做兩件事:
在我看來,所有來自用戶輸入的數據庫變量都使用 CodeIgniter 4 的esc()
function 進行了清理。
在我的控制器中,讀取 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.