在 PHP 中清理輸入
使用者資料需要儲存在資料庫中,但是在儲存到資料庫之前,我們需要確保不傳遞格式錯誤的資料;否則,它會搞砸資料庫。這將保護資料的完整性。使用者經常在清理和驗證之間混淆。它們之間的唯一區別是驗證確保資料的格式是否正確,而稍後確保資料中不存在非法字元。在今天的帖子中,我們將學習如何在將 PHP 中的輸入資料傳遞到資料庫(RDBMS/NoSQL)之前對其進行清理。
需要清理的最常見的輸入是 HTML、通過 SQL 查詢的輸入和使用者配置檔案資訊。
在 PHP 中使用 htmlentities()
處理 HTML 輸入
它是 PHP 提供的內建函式,可將所有字元轉換為 HTML 實體。你也可以使用 htmlspecialchars()
,這兩個函式的唯一區別是 htmlspecialchars()
將特殊字元轉換為 HTML 實體,而 htmlentities()
轉換所有字元。
PHP 中 htmlentities()
的語法
htmlentities(string $string, $flags, $characterSet, boolean $doubleEncode);
引數
$string
:它是一個強制性引數,它接受應該進行轉換的輸入資料。$flags
:這是一個可選引數,指定如何處理無效編碼、引號和使用的文件型別。一些標誌是ENT_COMPAT
、ENT_IGNORE
、ENT_HTML5
、ENT_NOQUOTES
等。$characterSet
:這是一個可選引數,用於指定要使用的字符集。一些字符集是UTF-8
、ISO-8859-1
等。doubleEncode
:這是一個可選引數,用於指定是否對現有的 HTML 實體進行編碼。預設值為true
,它將轉換所有內容。
返回值
上述函式的輸出包含一個轉換後的字串。如果字串引數包含無效編碼,它將返回一個空字串,除非任何標誌設定為 ENT_IGNORE
或 ENT_SUBSTITUTE
。
示例程式碼:
<?php
$str = '<a href="https://www.google.com">Go to google.com</a>';
echo htmlentities($str);
?>
輸出:
<a href="https://www.google.com">Go to google.com</a>
在 PHP 中使用 filter_var()
處理 HTML 輸入
它是 PHP 提供的內建函式,其中對輸入資料執行驗證和清理。
PHP 中 filter_var()
的語法
filter_var($inputValue, $filterType);
引數
$inputValue
:這是一個強制引數,它獲取將應用過濾器檢查的輸入資料。$filterType
:這是一個強制引數,它指定對輸入資料執行什麼過濾器檢查。支援的值是:FILTER_VALIDATE_INT
:輸入資料是否為有效整數。FILTER_SANITIZE_STRING
:輸入資料是否為有效字串,並從輸入字串中刪除所有 HTML 標籤。FILTER_VALIDATE_IP
:輸入資料是否是有效的 IP 地址。FILTER_SANITIZE_EMAIL
:輸入資料是否是有效的電子郵件地址。Filter var 會先去除非法字元,然後再進行驗證。
返回值
如果成功通過,則返回過濾後的值。
示例程式碼:
<?php
$inputString = "<p>Hello World! Welcome to PHP tutorial</p>";
$newstr = filter_var($inputString, FILTER_SANITIZE_STRING);
echo $newstr. "\n";
?>
輸出:
Hello World! Welcome to PHP tutorial
PHP 中的 SQL 查詢清理
為防止 SQL 注入,開發人員應始終使用 PDO
/MySQLi
。PDO 是一個資料庫抽象層。PDO 清理外部資料並將其安全地嵌入到 SQL 查詢中並避免此類問題。在將資料傳送到 DB 之前,使用 filter_var()
處理資料。
示例程式碼:
<?php
$servername = "hostname";
$username = "username";
$password = "password";
$dbname = "databaseName";
$lastname = "doe";
$connection = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $connection->prepare("SELECT id, email, firstname, lastname FROM Users WHERE lastname=:lastname");
$statement->execute(['lastname' => $lastname]);
$resultOuput = $statement->setFetchMode(PDO::FETCH_ASSOC);
?>
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.
LinkedIn