简体   繁体   English

数组数组上的 htmlspecialchars 不起作用

[英]htmlspecialchars on an array of arrays is not working

I have this form with a bunch of sections, and some of them have name of an array because they are supposed to add up dynamically.我有一个带有一堆部分的表单,其中一些有一个数组的名称,因为它们应该动态相加。 I'm trying to perform htmlspecialchars on them first and then once the submit button is clicked, echo them out on a next confirmation page, but it won't work for some reason.我首先尝试对它们执行 htmlspecialchars,然后单击提交按钮后,在下一个确认页面上将它们显示出来,但由于某种原因它不起作用。 I did print_r on $clean, but it didn't show the input $value of them, so I don't know where I did something wrong.我在 $clean 上做了 print_r,但它没有显示它们的输入 $value,所以我不知道我哪里做错了。

It would be great if somebody could help me on this.如果有人能在这方面帮助我,那就太好了。

Thank you.谢谢。

Here is a part of the htmlspecialchars code.这是 htmlspecialchars 代码的一部分。

$clean = array();

if( !empty($_POST) ) {

foreach( $_POST as $key => $value ) {

    if( is_array($key)){

      foreach($key as $key2 => $value2)

         $clean[$key2] = htmlspecialchars( $value2, ENT_QUOTES);

    } else {

        $clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
      }

    } 
}

This is a html part of it这是它的 html 部分

 <div class="seconf-h-form">
      <label>Multiple</label>
      <input type="radio" id="r2" name="team_select" 
      onchange="toggleFunc('ex_t_button');" value="Multiple"/>
 </div>

 <div class="element_wrap" id="box_2">
   <input type="submit" name="add" id="add" value="add more">
   <label>The name of your team</label>
   <input type="text" name="ex_team_n[]" id="ex_team_n"/>
   <select name="ex_amount[]">
      <option value="">Select</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
      <option value="6">6</option>
   </select>
  <div id="add_section"></div>

and this is the part where I echo them out这是我呼应它们的部分

<div class="element_wrap">
    <label>The name of your team</label>
    <p><?php echo $clean['ex_team_n']; ?></p>
</div>


<div class="element_wrap">
    <label>The number of your team</label>
    <p><?php echo $clean['ex_amount']; ?></p>
</div>

  <input type="hidden" name="amount" value="<?php if( 
  $clean['team_select'] === "Multiple"){echo $clean['ex_team_n'];} ?>">
  <input type="hidden" name="amount" value="<?php if( 
  $clean['team_select'] === "Multiple"){echo $clean['ex_amount'];} ?>">

You can use array_walk_recursive() to escape all data inside an array:您可以使用array_walk_recursive()来转义数组中的所有数据:

// Sample data, you can use $_POST instead or any other array
$array = array(
    [
        'a_key' => '<b>html</b>',
        'b_key' => '<a href="http://example.com/">another code</a>',
        'c_key' => array('<script>alert(\'Hello\');</script>', 'No code, no change'),
    ],
    [
        'd_key' => '<small>ssup</small>',
        'e_key' => 'stack',
        'f_key' => 'overflow',
    ],
);

// Function to escape the value, you must pass the item by reference using the & operator
function html_escape(&$item){
    $item = htmlspecialchars($item, ENT_QUOTES);
}

// Dump data before escaping
var_dump($array);

// Walk recursively through the array and call our function
array_walk_recursive($array, 'html_escape');

// Dump data after escaping
var_dump($array);

The data dumped before escaping转义前转储的数据

array (size=2)
  0 => 
    array (size=3)
      'a_key' => string '<b>html</b>' (length=11)
      'b_key' => string '<a href="http://example.com/">another code</a>' (length=46)
      'c_key' => 
        array (size=2)
          0 => string '<script>alert('Hello');</script>' (length=32)
          1 => string 'No code, no change' (length=18)
  1 => 
    array (size=3)
      'd_key' => string '<small>ssup</small>' (length=19)
      'e_key' => string 'stack' (length=5)
      'f_key' => string 'overflow' (length=8)

The data dumped after escaping转义后转储的数据

array (size=2)
  0 => 
    array (size=3)
      'a_key' => string '&lt;b&gt;html&lt;/b&gt;' (length=23)
      'b_key' => string '&lt;a href=&quot;http://example.com/&quot;&gt;another code&lt;/a&gt;' (length=68)
      'c_key' => 
        array (size=2)
          0 => string '&lt;script&gt;alert(&#039;Hello&#039;);&lt;/script&gt;' (length=54)
          1 => string 'No code, no change' (length=18)
  1 => 
    array (size=3)
      'd_key' => string '&lt;small&gt;ssup&lt;/small&gt;' (length=31)
      'e_key' => string 'stack' (length=5)
      'f_key' => string 'overflow' (length=8)

Documentation for array_walk_recursive() array_walk_recursive() 文档

You're not iterating over the right object and not creating the inner array.您没有迭代正确的对象,也没有创建内部数组。

Replace the lines:替换行:

if( is_array($key)){
    foreach($key as $key2 => $value2)
        $clean[$key2] = htmlspecialchars( $value2, ENT_QUOTES);

with

if( is_array($value)){
    foreach($value as $key2 => $value2) {
        if (!isset($clean[$key])) $clean[$key] = array();
        $clean[$key][$key2] = htmlspecialchars( $value2, ENT_QUOTES);
    }

And then it should work properly.然后它应该可以正常工作。

function sanitizeMyArray($array) {

    array_walk_recursive($array, 'standard');

    return $array;

}

function standard(&$item, $key) {

//You must return this to $item for it to work.
$item =  htmlspecialchars($item, ENT_QUOTES);

return $item;

}

$results = sanitizeMyArray($array);
print_r($results)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM