文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在 PHP 中编码 HTML

2024-02-27 20:33

关注

HTML 编码是在处理用户提供的数据时试图在 PHP Web 应用程序中防止跨站脚本 XSS。本教程将教你如何使用 htmlentities()htmlspecialchars() 和自定义方法对数据进行编码。


使用 htmlspecialchars() 编码

PHP htmlspecialchars() 是一个内置函数,可以将特殊字符转换为 HTML 实体。语法如下:


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

参数说明:

像所有函数一样,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 )

下面是对参数的解释:

此函数的返回值是编码字符串。

以下是使用 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>
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯