在 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 <b>bold text</b> a'nd á <script>alert();</script> 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
頁面的檢視原始碼顯示瀏覽器將撇號編碼為'
:
A <b>bold text</b> a'nd á <script>alert();</script> 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 <b>bold text</b> ánd a <script>alert();</script> 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 <b>bold text</b> ánd a <script>alert();</script> tag'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;
?>
檢視頁面來源:
àéò ©€ ♣♦
↠ ↔↛ āžš
ķūņ ↙ ℜ℞ ∀∂∋
rūķīš ○
使用自定義方法編碼
如果你想滾動編碼方案,自定義方法可以派上用場。此方法將獲取你的輸入字串並應用一些字串操作。最後,你會得到一個編碼字串。
下面的 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 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