【问题标题】:htmlspecialchars on an array of arrays is not working数组数组上的 htmlspecialchars 不起作用
【发布时间】:2018-09-04 00:37:35
【问题描述】:

我有一个包含一堆部分的表格,其中一些有一个数组的名称,因为它们应该是动态加起来的。我试图先对它们执行 htmlspecialchars,然后单击提交按钮后,在下一个确认页面上回显它们,但由于某种原因它不起作用。我在 $clean 上做了 print_r,但它没有显示它们的输入 $value,所以我不知道我哪里做错了。

如果有人能在这方面帮助我,那就太好了。

谢谢。

这是 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);
      }

    } 
}

这是一个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>

这是我回应它们的部分

<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'];} ?>">

【问题讨论】:

    标签: php arrays forms dynamic htmlspecialchars


    【解决方案1】:

    您可以使用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);
    

    转义前转储的数据

    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)
    

    转义后转储的数据

    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)
    

    Documentationarray_walk_recursive()

    【讨论】:

      【解决方案2】:

      您没有迭代正确的对象,也没有创建内部数组。

      替换行:

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

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

      然后它应该可以正常工作。

      【讨论】:

        【解决方案3】:
        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)
        

        【讨论】:

          猜你喜欢
          • 2020-12-15
          • 2012-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-20
          • 2018-03-31
          • 1970-01-01
          相关资源
          最近更新 更多