htmlspecialchars()足够安全吗?

时间:2014-07-21 08:09:35

标签: php security

用户输入就像这样

$user_input = htmlspecialchars($_GET['$user_input']);

根据PHP.net:

'&' (ampersand) becomes '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
"'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

但是$呢?例如,代码是这样的:

echo "Some cool text $user_input";

现在假设用户输入为$secretCode,所以:$_GET['$user_input'] = "$secretCode"; 那么代码是否会回显$secretCode

还有什么呢。让我们假设代码是这样的:

$html = <<<EOF <head>.... EOF;

如果输入为$_GET['$user_input'] = "EOF;";,这会退出字符串怎么办?

3 个答案:

答案 0 :(得分:2)

你假设一个不存在的等级解释。 如果 ,您可以像这样写字符串文字

$foo = 'bar';
$baz = "Hello $foo";

然后是,$foo将被插入到字符串中。那是因为它在PHP源代码中被明确写成字符串文字。

另一方面:

$foo = 'bar';
$baz = $_GET['var'];

在任何情况下都不会插入任何内容。也不在这里:

$foo = <<<EOL
    $_GET[var]
EOL;

$_GET['var']可以包含任何想要的东西,它无关紧要。 PHP不会反复评估所有值,以查看是否可能存在可插值的内容。这里没有安全问题。

要激发任何这种递归行为,您必须将构造 PHP源代码显式为字符串,然后显式评估

$code = <<<EOL
    $foo = 'bar';
    echo "Hello $_GET[var]";
EOL;

// $code is now, say:
// $foo = 'bar';
// echo "Hello $foo";

eval($code);

除非你做这样的事情(并且请永远不要使用eval),否则什么都不会发生。

为了在HTML中嵌入任意文本,htmlspecialchars可以转义在HTML中具有特殊含义的字符;是的,这是安全的。

答案 1 :(得分:0)

php不会解析变量本身内部的变量,因为变量没有清楚地写在你的php代码中,php不会在这个级别解析变量。因此,请注意以下示例将失败,并输出some text and $bar而不是some text and test

$_GET['foo'] = '$bar';

$baz = $_GET['foo'];
$bar = 'test';

echo "some text and $baz";
// some text and $bar

答案 2 :(得分:0)

PHP代码中的常量字符串将被解析,但来自其他来源的字符串不会。

因此,在下面的行中,变量$world将被展开:

$var = "Hello $world";

在下面的行中,使用确切的值,因为它(可能)从数据库中读取。即使字段&#39;示例&#39; world包含文本'Hello $world',变量$ world不会被展开。

$var = $row['example'];

这是正常的PHP行为,本身与htmlspecialchars无关。