在 PHP 中清理輸入

Shraddha Paghdar 2023年1月30日
PHP
  1. 在 PHP 中使用 htmlentities() 處理 HTML 輸入
  2. 在 PHP 中使用 filter_var() 處理 HTML 輸入
  3. PHP 中的 SQL 查詢清理
在 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_COMPATENT_IGNOREENT_HTML5ENT_NOQUOTES 等。
  • $characterSet:這是一個可選引數,用於指定要使用的字符集。一些字符集是 UTF-8ISO-8859-1 等。
  • doubleEncode:這是一個可選引數,用於指定是否對現有的 HTML 實體進行編碼。預設值為 true,它將轉換所有內容。

返回值

上述函式的輸出包含一個轉換後的字串。如果字串引數包含無效編碼,它將返回一個空字串,除非任何標誌設定為 ENT_IGNOREENT_SUBSTITUTE

示例程式碼:

<?php
    $str = '<a href="https://www.google.com">Go to google.com</a>';
    echo htmlentities($str);
?>

輸出:

&lt;a href=&quot;https://www.google.com&quot;&gt;Go to google.com&lt;/a&gt;

在 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 Paghdar avatar Shraddha Paghdar avatar

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