如何在 PHP 中正确转义 HTML 表单输入默认值?

Posted

技术标签:

【中文标题】如何在 PHP 中正确转义 HTML 表单输入默认值?【英文标题】:How can I properly escape HTML form input default values in PHP? 【发布时间】: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 值还没有被编码。没有魔术引号 - 什么都没有。

【问题讨论】:

【参考方案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 案例中的问题。

【讨论】:

以上是关于如何在 PHP 中正确转义 HTML 表单输入默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP在数据库中保存HTML META和JavaScript?

Dojo Toolkit:如何转义 HTML 字符串?

HTML-实体(转义字符)

从 PHP 中的输入表单获取日期

get_magic_quotes_gpc() PHP转义的真正含义

如何记住 PHP 表单中的文本输入?