如何在 PHP 中正确转义 HTML 表单输入默认值?
Posted
技术标签:
【中文标题】如何在 PHP 中正确转义 HTML 表单输入默认值?【英文标题】:How can I properly escape HTML form input default values in PHP? 【发布时间】:2011-09-09 02:24:38 【问题描述】:<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 &quot;code&quot;...'
你看到的只是 We
注意:<input>
标签中的 value 属性使用双引号很重要。
除非您将ENT_QUOTES
指定为第二个htmlspecialchars()
参数,否则不会转义单引号。因此,$_POST
值中存在的任何单引号都将超出 <input>
字段。
注意:不要试图使用 htmlentities()。这会破坏 UTF-8 字符。正如 rid 所说,使用 htmlspecialchars().
如果您不使用ENT_QUOTES
参数,则不会转义单引号。如果在输入标签中将值参数定义为value="double quotes"
,这不是问题。双引号在用户提供的字符串中被转义,带有value="...
的部分由服务器提供。【参考方案3】:
htmlspecialchars 在这两种情况下都可以使用。查看不同的标志选项,以避免引号成为input
案例中的问题。
【讨论】:
以上是关于如何在 PHP 中正确转义 HTML 表单输入默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用PHP在数据库中保存HTML META和JavaScript?