【问题标题】:PHP Santizing/Validating Array of IntegersPHP清理/验证整数数组
【发布时间】:2011-12-02 19:41:13
【问题描述】:

我有以下数组,想知道验证和清理此数组以确保只允许使用整数的最佳方法是什么?

if(is_array($_POST['taxonomy'])) {
    $term_ids = array_map('esc_attr', $_POST['taxonomy']);
}

打印出来的样子是这样的:

Array
(
    [0] => 13
    [1] => 12
)

我知道 esc_attr 不是很安全,所以想要一些更强大的东西。

任何帮助都会很棒。

干杯,

戴夫

【问题讨论】:

  • 无论如何都将它们转换为 INT...
  • 如果它是一个字符串,我只会使用 (int) 但有类似用于数组的东西吗?感谢您的回复
  • 您对循环中的数组值执行此操作
  • 只需转换它们并将它们映射到整数。

标签: php arrays validation integer sanitization


【解决方案1】:
foreach( $array as $key => $value) {
    $array[$key] = (int) $value;

    if( $array[$key] != $value ) {
        // error
    }
}

【讨论】:

  • POST 数据从来不是int,都是字符串。
  • 这看起来像数字:数组 ( [0] => 13 [1] => 12 )
  • 是的,但它们是字符串,而不是ints。
【解决方案2】:

由于它是$_POST 数据,您需要检查ctype_digit(即仅包含数字的字符串):

$sanitizedValues = array_filter($_POST['taxonomy'], 'ctype_digit');

请注意,这只会丢弃非数字值。

【讨论】:

  • 刚刚尝试过,它似乎可以正常工作,顺便感谢其他所有人的 cmets,非常有帮助!不过,这有多安全?如果有人要向这个数组中注入一些东西? (我们在黑客攻击方面遇到了一些问题,因此我正在检查所有代码并堵住任何漏洞)。干杯
  • 有了这个你可以确定$sanitizedValues只包含只包含数字的字符串。不多也不少。
  • 非常好,非常干净。干杯 @deceze 和所有发布回复的人。
  • 不错。正是我想要的。赞一个。
【解决方案3】:
if(is_array($_POST['taxonomy'])) {
    $term_ids = array_map('intval', $_POST['taxonomy']);
}

应该做的伎俩。注意:这是卫生。更多:http://php.net/manual/en/function.intval.php

【讨论】:

    【解决方案4】:

    另一种方法是使用 phps filter 函数:

    $array = array(
      13, 12, '1', 'a'
    );
    
    $result = filter_var($array, FILTER_VALIDATE_INT, array(
      'flags'   => FILTER_REQUIRE_ARRAY,
      'options' => array('min_range' => 1)
    ));
    
    var_dump($result);
    
    /*
    array(4) {
      [0]=>
      int(13)
      [1]=>
      int(12)
      [2]=>
      int(1)
      [3]=>
      bool(false)
    }
    */
    

    【讨论】:

    • 更冗长但在技术上更合适。 +1 :)
    • 对不起,这两者有什么区别?
    • 如果您验证的是单个字段,我认为这只是个人喜好问题。尽管如果您有很多验证过滤器功能可以为您节省一些工作(例如,请参阅filter_input_array)。而且我想,如果您或其他人必须在 3 个月后了解您在做什么,过滤器功能会更清楚地显示正在发生的事情。
    • 目前它只是一个输入。我已经检查了 filter_input_array ,它看起来非常有用!我也会 +1 这个答案,非常感谢@Yoshi 的帮助和建议。每天都是上学日:-)
    【解决方案5】:

    如果您正在寻找单线来检查指定条件,您可以使用:

    $onlyIntegers = Arr::check($_POST['taxonomy'], 'ctype_digit');
    

    假设您的$_POST['taxonomy'] 可以包含@deceze 建议的数字字符串,或者只是简单的:

    $onlyIntegers = Arr::check($_POST['taxonomy'], 'is_int');
    

    如果您确定 $_POST['taxonomy'] 值实际上应该是整数。

    Arr::check 方法是 php array library 的一部分,它包含各种方法来帮助您处理不同类型的数组。

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2016-02-12
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多