var_dump或print_r和html编码

Ave*_*Joe 7 php xss var-dump html-entities

<?php 

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

在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>"
}
Run Code Online (Sandbox Code Playgroud)

显然,我本可以通过XSS进行操作!
如何确保数组值是htmlencoded?

Sel*_*ent 19

虽然这个问题有一个公认的答案,但我认为David Morrow的答案是最好的/最简单的/最实用的(使用print_r true旗帜):

echo "<pre>".htmlentities(print_r($some_array, true))."</pre>";
Run Code Online (Sandbox Code Playgroud)

从来没有,这是另一种使用输出缓冲的解决方案:

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)


Fro*_*dik 9

我发现knittl的代码不起作用.我不得不做一些小改动让它按如下方式工作:

array_walk_recursive($inputarray, function(&$v) { $v = htmlspecialchars($v); });
Run Code Online (Sandbox Code Playgroud)

现在这在PHP5.3 +中运行良好


Uwe*_*eim 7

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

他替换的函数var_dump实现为:

function htmlvardump()
{
    ob_start(); 
    $var = func_get_args(); 
    call_user_func_array('var_dump', $var); 
    echo htmlentities(ob_get_clean());
 } 
Run Code Online (Sandbox Code Playgroud)

这在 PHP 5.3+ 中对我有用。

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


Dav*_*row 7

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

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

输出:

Array
(
   [0] => <script>alert("hey");</script>
)
Run Code Online (Sandbox Code Playgroud)

脚本未执行


kni*_*ttl 5

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

array_walk_recursive($inputarray, function(&$v) { $v = htmlspecialchars($v); });
Run Code Online (Sandbox Code Playgroud)

  • @micha:更短?它是一个不同的函数,以不同的方式对其输入进行编码 (2认同)

小智 5

echo <pre>;
echo htmlspecialchars(print_r($key['value'], true));
echo '</pre>';
Run Code Online (Sandbox Code Playgroud)

我使用此代码从无 sql 数据库输出数组值(包含 adsense 代码)。