【问题标题】:How can I properly escape HTML form input default values in PHP?如何在 PHP 中正确转义 HTML 表单输入默认值?
【发布时间】:2011-09-09 02:24:38
【问题描述】:

给定以下两个 HTML/PHP sn-ps:

<input type="text" name="firstname" value="<?php echo $_POST['firstname']; ?>" />

<textarea name="content"><?php echo $_POST['content']; ?></textarea>

我需要对回显的$_POST 变量使用什么字符编码?我可以使用任何内置的 PHP 函数吗?

请假设$_POST 值还没有被编码。没有魔术引号 - 什么都没有。

【问题讨论】:

    标签: php html forms xss


    【解决方案1】:

    考虑到它有点长,我会把它放在一个函数中

    <?PHP
    function encodeValue ($s) {
        return htmlentities($s, ENT_COMPAT|ENT_QUOTES,'ISO-8859-1', true); 
    }
    ?>
    

    这有 ENT_QUOTES 以确保对单引号和双引号进行编码,但它也会对特殊字符进行编码(如在 José 中),而不是插入空字符串。

    那么你可以这样做:

    <input type="text" name="firstname" value="<?= encodeValue($_POST['firstname']) ?>" />
    

    <textarea name="content"><?= encodeValue($_POST['content']) ?></textarea>
    

    【讨论】:

    • ENT_QUOTES 就足以逃脱双重和单一。
    • 不清楚为什么这个答案指定ISO-8859-1,而不是今天更常用的默认值UTF-8。如有疑问,请从更简单的 return htmlentities($s, ENT_QUOTES); 开始
    • @ToolmakerSteve,为什么是 IOS-8859-1 与 UTF-8,因为那是有效的,我从未测试过 UTF-8。欢迎在那里进行一些调查。仅使用 ENT_QUOTES 不适用于带有重音符号的字符,并且会搞砸名称。
    【解决方案2】:

    使用htmlspecialchars($_POST['firstname'])htmlspecialchars($_POST['content'])

    在将字符串显示给用户之前,始终使用 htmlspecialchars() 对其进行转义。

    【讨论】:

    • 但是,htmlspecialchars() 无法帮助您处理 value='single quotes' 这就是发生的情况:value='We're not using this in our &amp;quot;code&amp;quot;...' 你看到的只是 We
    • 注意:&lt;input&gt; 标签中的 value 属性使用双引号很重要。
    • 除非您将ENT_QUOTES 指定为第二个htmlspecialchars() 参数,否则不会转义单引号。因此,$_POST 值中存在的任何单引号都将超出 &lt;input&gt; 字段。
    • 注意:不要试图使用 htmlentities()。这会破坏 UTF-8 字符。正如 rid 所说,使用 htmlspecialchars().
    • 如果您不使用ENT_QUOTES 参数,则不会转义单引号。如果在输入标签中将值参数定义为value="double quotes",这不是问题。双引号在用户提供的字符串中被转义,带有value="...的部分由服务器提供。
    【解决方案3】:

    htmlspecialchars 在这两种情况下都可以使用。查看不同的标志选项,以避免引号成为input 案例中的问题。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2023-03-15
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多