在 PHP 中編碼 HTML

Habdul Hazeez 2023年1月30日
  1. 使用 htmlspecialchars() 編碼
  2. htmlentities() 編碼
  3. 使用 htmlentities() 和 HTML5 編碼進行編碼
  4. 使用自定義方法編碼
在 PHP 中編碼 HTML

HTML 編碼是在處理使用者提供的資料時試圖在 PHP Web 應用程式中防止跨站指令碼 XSS。本教程將教你如何使用 htmlentities()htmlspecialchars() 和自定義方法對資料進行編碼。

使用 htmlspecialchars() 編碼

PHP htmlspecialchars() 是一個內建函式,可以將特殊字元轉換為 HTML 實體。語法如下:

htmlspecialchars( $string, $flags, $encoding, $double_encode )

引數說明:

  • $string: 輸入字串
  • $flags:指示函式應如何處理字串中的引號的標誌
  • $encoding:指定函式使用的編碼。該引數是可選的
  • $double_encode:一個布林屬性,指示 PHP 是否將對現有實體進行編碼。如果將其設定為 false,PHP 將不會對現有實體進行編碼

像所有函式一樣,htmlspecialchars() 返回一個值。它的值是轉換後的字串。但是,如果函式認為該字串無效,它將返回一個空字串。

下一個示例展示瞭如何使用 htmlspecialchars() 轉換字串。你會觀察到該函式未與任何標誌一起使用。

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode);

    echo $encodedString;
?>

輸出:

A <b>bold text</b> a'nd á <script>alert();</script> tag

當你檢視網頁的原始碼時,你會發現撇號和 á 字元未編碼:

A &lt;b&gt;bold text&lt;/b&gt; a'nd á &lt;script&gt;alert();&lt;/script&gt; tag

現在,如果你向 htmlspecialchars() 提供標誌和編碼格式,撇號會被編碼,但 á 不會。

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode, ENT_QUOTES, 'UTF-8');
    
    echo $encodedString;
?>

輸出:

A <b>bold text</b> a'nd á <script>alert();</script> tag

頁面的檢視原始碼顯示瀏覽器將撇號編碼為&#039;

A &lt;b&gt;bold text&lt;/b&gt; a&#039;nd á &lt;script&gt;alert();&lt;/script&gt; tag

htmlentities() 編碼

htmlentites() 也是一個內建的 PHP 函式。使用 htmlentities(),所有適用的字元都將轉換為 HTML 實體。它的語法如下:

htmlentities( $string, $flags, $encoding, $double_encode )

下面是對引數的解釋:

  • $string: 輸入字串
  • $flags:指示函式應如何處理字串中的引號的標誌
  • $encoding:指定函式使用的編碼。該引數是可選的
  • $double_encode:一個布林屬性,指示 PHP 是否將對現有實體進行編碼。如果將其設定為 false,PHP 將不會對現有實體進行編碼

此函式的返回值是編碼字串。

以下是使用 htmlentities() 轉換字串的示例。這裡 htmlentities() 不與任何標誌一起使用。

<?php    
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode);

    echo $ecodedString;
?>

輸出:

A <b>bold text</b> ánd a <script>alert();</script> tag's

該頁面的檢視源顯示該函式對á字元進行了編碼,沒有任何標誌,但撇號沒有編碼。

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag's

對程式碼的更改將允許函式對撇號進行編碼。

<?php
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode, ENT_QUOTES, 'UTF-8');

    echo $ecodedString;
?>

輸出:

A <b>bold text</b> ánd a <script>alert();</script> tag's

檢視頁面來源:

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag&#039;s

使用 htmlentities() 和 HTML5 編碼進行編碼

當字串中有非英文字元時,可以使用 HTML 5 標誌和 UTF-8 編碼。

HTML5 標誌指示函式將字串視為 HTML5,而 UTF-8 標誌允許函式理解任何標準 Unicode 字元。

以下是如何使用帶有 HTML5 標誌和 UTF-8 編碼的 htmlentities() 的示例:

<?php
    $stringToEncode = "àéò ©€ ♣♦ ↠ ↔↛ āžšķūņ ↙ ℜ℞ ∀∂∋ rūķīš ○";

    $ecodedString = htmlentities($stringToEncode, ENT_HTML5, 'UTF-8');
    
    echo $ecodedString;
?>

檢視頁面來源:

&agrave;&eacute;&ograve; &copy;&euro; &clubs;&diamondsuit;
&twoheadrightarrow; &harr;&nrarr; &amacr;&zcaron;&scaron;
&kcedil;&umacr;&ncedil; &swarr; &Rfr;&rx; &forall;&part;&ReverseElement;
r&umacr;&kcedil;&imacr;&scaron; &cir;

使用自定義方法編碼

如果你想滾動編碼方案,自定義方法可以派上用場。此方法將獲取你的輸入字串並應用一些字串操作。最後,你會得到一個編碼字串。

下面的 HTML 有一個文字區域和一個提交按鈕。表單 action 指向一個檔案,該檔案將對傳遞到表單輸入的字串進行編碼。

<main>
    <h1>Enter and HTML code and click the submit button</h1>
    <form action='encodedoutput.php' method='post'>
        <div class="form-row">
            <textarea rows='15' cols='50' name='texttoencode' required></textarea>
        </div>
        <div class="form-row">
            <input type='submit'>
        </div>
    </form>
</main>

下一個程式碼塊是執行編碼的 PHP 程式碼。將其儲存為 encodedoutput.php

<?php
    if (isset($_POST['texttoencode']) && !empty($_POST)) {
        // Check for empty text
        if ($_POST['texttoencode'] == "") {
            echo "Invalid text";
            die();
        }

        $inputHTML = bin2hex($_POST['texttoencode']); 
        $spiltHTML = chunk_split($inputHTML, 2 ,"%");
        $HTMLStringLength = strlen($spiltHTML);
        $HTMLSubLength = $HTMLStringLength - 1;
        $HTMLSubString = substr($spiltHTML,'0', $HTMLSubLength);

        $encodedOutput="<script>document.write(unescape('%$HTMLSubString'));</script>";

    } else {
        echo "Not allowed";
        die();
    }
?>

<textarea rows='15' cols='60'>
    <?php
        if ($encodedOutput) {
            echo $encodedOutput;
        } else {
            echo "";
            die();
        }
    ?>
</textarea>

<script>alert("Hello world");</alert> 的示例輸出:

<script>document.write(unescape('%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%48%65%6c%6c%6f%20%77%6f%72%6c%64%22%29%3b%3c%2f%61%6c%65%72%74%3e'));</script>
作者: Habdul Hazeez
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn

相關文章 - PHP Encode