问题
希望在一个HTML页面上安全地显示用户输入的数据。例如,允许用户为一个博文增加评论,但不希望评论中的HTMIL或JavaScript带来问题。
解决方案
在显示用户输入之前,先将用户输入传入htmlentities()。****
转义HTML
print 'The comment was: ';
print htmlentities($_POST['comment']);
htmlentities 是一个在 PHP 中非常有用的函数,它的主要作用是将字符转换为 HTML 实体。这意味着,一些在 HTML 中有特殊意义的字符(比如 <、>、&、" 和 ')会被转换成 HTML 实体(比如 <、>、&、" 和 ')。
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )
$string:需要转换的字符串。
$flags:一个位掩码,决定了哪些字符会被转换。常用的值有 ENT_COMPAT(仅转换双引号)、ENT_QUOTES(转换双引号和单引号)、ENT_NOQUOTES(不转换任何引号)。可以组合使用,用按位或操作符 |。
$encoding:字符编码。如果未设置,默认使用 PHP 配置中的 default_charset。
$double_encode:当设置为 false 时,已经转换过的 HTML 实体不会被再次转换。默认为 true。
转义HTML实体
// 定义了一个包含HTML链接的字符串
$html = "Stew's favorite movie.";
// 使用htmlspecialchars函数转换字符串,但没有指定任何标志
// 默认情况下,这个函数会将双引号(")转换为HTML实体,但不会转换单引号(')
// 输出: <a href=&##039;fletch.html'>Stew's favorite movie.</a>
// 注意:单引号没有被转换,因为默认行为不包括转换单引号
print htmlspecialchars($html);
print '
';
// 使用htmlspecialchars函数转换字符串,并指定ENT_QUOTES标志
// 这个标志告诉函数同时转换双引号和单引号
// 输出: <a href="fletch.html">Stew's favorite movie.</a>
// 注意:双引号和单引号都被转换了
print htmlspecialchars($html, ENT_QUOTES);
print '
';
// 使用htmlspecialchars函数转换字符串,并指定ENT_NOQUOTES标志
// 这个标志告诉函数不转换任何引号
// 输出: <a href='fletch.html'>Stew's favorite movie.</a>
// 注意:无论是单引号还是双引号都没有被转换
print htmlspecialchars($html, ENT_NOQUOTES);