用户输入就像这样
$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 '<'
'>' (greater than) becomes '>'
但是$
呢?例如,代码是这样的:
echo "Some cool text $user_input";
现在假设用户输入为$secretCode
,所以:$_GET['$user_input'] = "$secretCode";
那么代码是否会回显$secretCode
?
还有什么呢。让我们假设代码是这样的:
$html = <<<EOF <head>.... EOF;
如果输入为$_GET['$user_input'] = "EOF;";
,这会退出字符串怎么办?
答案 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)
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无关。