10
<?php 

$x = array("<b>","<i>","b","i","<h1>hello</h1>");
print_r ($x);
echo "<hr>";
var_dump ($x);

在 html 源代码中输出这个!

Array
(
    [0] => <b>
    [1] => <i>
    [2] => b
    [3] => i
    [4] => <h1>hello</h1>
)
<hr>array(5) {
  [0]=>
  string(3) "<b>"
  [1]=>
  string(3) "<i>"
  [2]=>
  string(1) "b"
  [3]=>
  string(1) "i"
  [4]=>
  string(14) "<h1>hello</h1>"
}

显然,我可能会被 XSS 攻击!
如何确保数组值是 htmlencoded?

4

8 回答 8

24

虽然这个问题有一个公认的答案,但我认为大卫莫罗的答案是最好的/最简单的/最实用的(使用print_r true标志):

echo "<pre>".htmlentities(print_r($some_array, true))."</pre>";

无论如何,这是另一个使用输出缓冲的解决方案:

<?php

ob_start();
print_r($some_array);
$buffer = ob_get_clean();
echo "<pre>".htmlentities($buffer)."</pre>";

?>
于 2015-03-15T20:30:27.490 回答
10

我发现knittl的代码不起作用。我必须进行一些小的更改才能使其正常工作,如下所示:

array_walk_recursive($inputarray, function(&$v) { $v = htmlspecialchars($v); });

现在这在 PHP5.3+ 中工作正常

于 2013-04-27T14:20:44.407 回答
8

或者您可以将 print_r 保存为字符串,然后使用设置为 true 的第二个参数对其进行转义。

$arr = array('<script>alert("hey");</script>');
$str = print_r($arr, true);
echo htmlentities($str);

输出:

Array
(
   [0] => <script>alert("hey");</script>
)

脚本未执行

于 2015-02-19T18:12:08.543 回答
7

这个 PHP 手册注释中描述了一个对我有用的函数。

他的替换功能var_dump实现为:

function htmlvardump()
{
    ob_start(); 
    $var = func_get_args(); 
    call_user_func_array('var_dump', $var); 
    echo htmlentities(ob_get_clean());
 } 

这在 PHP 5.3+ 中适用于我。

(请注意,原始来源中有错字)。

于 2012-10-12T07:01:49.653 回答
5

一个简单的解决方案是使用array_walk_recursive

array_walk_recursive($inputarray, function(&$v) { $v = htmlspecialchars($v); });
于 2012-04-07T16:48:42.133 回答
4
echo <pre>;
echo htmlspecialchars(print_r($key['value'], true));
echo '</pre>';

我使用此代码从没有 sql 数据库中输出一个数组值(包含 adsense 代码)。

于 2015-09-30T14:17:33.823 回答
1

感谢 Knittl,这就是我想出的。按我想要的方式工作!

<?php 


$x = array("tag1" => "<b>","tag2" => "<i>","tag3" => "b","tag4" => "i","tag5" => "<h1>hello</h1>");

echo "<hr><pre>";
blp_print_r ($x);
echo "<hr>";
print_r($x);
echo "</pre><hr>"; 

/*

outputs this in the browser normal view

new one... 

Array
(
        ['tag1'] => <b>
        ['tag2'] => <i>
        ['tag3'] => b
        ['tag4'] => i
        ['tag5'] => <h1>hello</h1>
)


traditional one...

Array
(
    [tag1] => 
    [tag2] => 
    [tag3] => b
    [tag4] => i
    [tag5] => 
hello


)

*/



function blp_print_r($inputarray){
    echo "Array\n(\n";
    echo "<blockquote>";
    array_walk($inputarray,"html_encoder");
    echo "</blockquote>";
    echo ")";
}

function html_encoder($current_val,$current_key){

    echo "['" , htmlentities($current_key, ENT_QUOTES, "UTF-8") , "']", " => ";
    echo htmlentities($current_val, ENT_QUOTES, "UTF-8") , "\n";
}

?>
于 2012-04-07T20:16:51.427 回答
1

我发现这个页面很有帮助,但我确实将函数修改为递归,walker 处理函数在回显键后检查值处的数组,然后回调该数组上的原始函数。我认为这使它成为一个真正的'递归 htmlentity 函数,因此有了新名称......

function htmlentities_print_r( $inputarray ) {

    echo "<pre>" ;

         array_walk( $inputarray , "html_encoder" ) ;

    echo "</pre>";

}

function html_encoder($current_val,$current_key){

    echo "['" , htmlentities($current_key, ENT_QUOTES, "UTF-8") , "']", " => ";

    if ( is_array( $current_val ) ) {

        blp_print_r( $current_val ) ;

    } else {

        echo htmlentities($current_val, ENT_QUOTES, "UTF-8") , "\n";

    }
}
于 2014-01-04T07:14:03.543 回答