PHP - 輸入資料過濾



在 PHP 中,確保輸入資料經過適當的過濾非常重要,在伺服器端程式碼處理資料之前,需移除任何不需要的字元。通常,使用者透過 HTML 表單將資料輸入到 PHP Web 應用程式中。如果表單資料包含任何不需要的字元,可能會造成危害,因此必須執行適當的清理操作。

可以使用 PHP 中的一個或多個以下函式進行輸入過濾。

htmlspecialchars() 函式

此函式將特殊字元轉換為 HTML 實體。

htmlspecialchars(
   string $string,
   int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
   ?string $encoding = null,
   bool $double_encode = true
): string

在 HTML 中,某些字元具有特殊含義。此 htmlspecialchars() 函式用於將特殊字元編碼為 HTML 實體。當您希望將使用者輸入顯示為 HTML 並希望防止指令碼注入攻擊時,這很有用。

以下特殊字元將按如下所示轉換:

字元 替換為
& (和號) &
" (雙引號) ", 除非設定了ENT_NOQUOTES
' (單引號) ' (對於ENT_HTML401) 或 ' (對於ENT_XML1, ENT_XHTMLENT_HTML5),但僅當設定了ENT_QUOTES
< (小於號) &lt;
> (大於號) &gt;

標誌常量

flags 引數是以下一個或多個標誌的位掩碼,這些標誌指定如何處理引號、無效程式碼單元序列和使用的文件型別。

序號 常量 & 描述
1

ENT_COMPAT

將轉換雙引號並保留單引號。

2

ENT_QUOTES

將轉換雙引號和單引號。

3

ENT_NOQUOTES

將保留雙引號和單引號。

4

ENT_IGNORE

丟棄無效程式碼單元序列,而不是返回空字串。

5

ENT_SUBSTITUTE

將無效程式碼單元序列替換為 Unicode 替換字元 U+FFFD (UTF-8) 或 &#xFFFD;。

6

ENT_DISALLOWED

將給定文件型別中無效的程式碼點替換為 Unicode 替換字元 U+FFFD (UTF-8) 或 &#xFFFD; (否則),而不是保留它們。這可能很有用。

7

ENT_HTML401

將程式碼處理為 HTML 4.01。

8

ENT_XML1

將程式碼處理為 XML 1。

9

ENT_XHTML

將程式碼處理為 XHTML。

10

ENT_HTML5

將程式碼處理為 HTML 5。

示例

請檢視以下示例:

<?php
   $str = 'Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>';
   echo htmlspecialchars($str);
?>

它將產生以下輸出

Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>

strip_tags() 函式

strip_tags() 函式從給定字串中刪除所有 HTML 和 PHP 標記。

strip_tags(string $string, array|string|null $allowed_tags = null): string

當您希望確保使用者輸入不包含任何潛在的惡意標記時,此函式非常有用。

allowed_tags 引數是一個可選的第二個引數,用於指定不應去除的標記。它們要麼以字串形式給出,要麼以陣列形式給出。

示例

請檢視以下示例:

<?php
   $text = '<p>Hello World</p><!-- Comment --> 
      <a href="/test.html">Click Here</a>';
   echo strip_tags($text);
   echo "\n";

   // Allow <p> and <a>
   echo strip_tags($text, '<p><a>');
?>

它將產生以下輸出

Hello World 
      Click Here
Hello World

 
      Click Here

addslashes() 函式

addslashes() 函式向字串新增反斜槓。

addslashes(string $string): string

該函式返回一個字串,在需要轉義的字元前新增反斜槓。這些字元是:

  • 單引號 (')

  • 雙引號 (")

  • 反斜槓 (\)

  • NUL (空位元組)

當您將使用者輸入儲存到資料庫中並希望防止 SQL 注入攻擊時,請使用此函式。

示例

請檢視以下示例:

<?php
   $text = "Newton's Laws";
   $str = addslashes($text);  

   // prints the escaped string 
   echo($str);  
?>

它將產生以下輸出

Newton\'s Laws

filter_var() 函式

藉助特定的過濾器標誌,您可以使用 filter_var() 函式過濾使用者輸入。

filter_var(mixed $value, int $filter = 
   FILTER_DEFAULT, array|int $options = 0): mixed

$value 引數是一個需要過濾其值的變數。$filter 引數是任何預定義的過濾器常量。

序號 ID & 描述
1

FILTER_SANITIZE_EMAIL

刪除除字母、數字和 !#$%&'*+-=?^_`{|}~@.[]. 之外的所有字元。

2

FILTER_SANITIZE_ENCODED

URL 編碼字串,可選地去除或編碼特殊字元。

3

FILTER_SANITIZE_ADD_SLASHES

應用 addslashes()。(從 PHP 7.3.0 開始可用)。

4

FILTER_SANITIZE_NUMBER_FLOAT

刪除除數字、+- 和可選的 .,eE 之外的所有字元。

5

FILTER_SANITIZE_NUMBER_INT

刪除除數字、加號和減號之外的所有字元。

6

FILTER_SANITIZE_SPECIAL_CHARS

HTML 編碼 '"<>& 和 ASCII 值小於 32 的字元,可選地去除或編碼其他特殊字元。
特殊字元。

7

FILTER_SANITIZE_FULL_SPECIAL_CHARS

等效於呼叫 htmlspecialchars() 並設定ENT_QUOTES。可以透過設定FILTER_FLAG_NO_ENCODE_QUOTES 來停用編碼引號。

8

FILTER_SANITIZE_URL

刪除除字母、數字和 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.

9

FILTER_UNSAFE_RAW

示例

以下程式碼展示瞭如何過濾電子郵件資料:

<?php
   $a = 'abc def@xyz.com';

   $sa = filter_var($a, FILTER_SANITIZE_EMAIL);
   echo "$sa";
?>

它將產生以下輸出

abcdef@xyz.com

示例

以下程式碼展示瞭如何過濾 URL:

<?php
   $a = "http://example.c o m";

   $sa = filter_var($a, FILTER_SANITIZE_URL);
   echo "$sa";
?>

它將產生以下輸出

http://example.com
廣告