2011-10-07 27 views
9

我有以下数组,并想知道验证和santizing这个数组以确保只有整数允许的最佳方式是什么?PHP Santizing /验证数组整数

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

,看起来像这样打印时:

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

我知道esc_attr是不是很安全所以想一些更加强了。

任何帮助将是伟大的。

干杯,

戴夫

+0

它们转换成的INT不管是什么... –

+0

如果这是一个字符串,我只是用(INT),但有什么类似于用于数组?感谢您的回复 – daveaspinall

+0

您可以在循环中为数组值进行此操作 –

回答

12

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

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

注意,这简单地丢弃非数字值。

+0

刚刚尝试过这一点,它似乎是工作现场,感谢大家elses评论的方式,非常有帮助!这有多安全?如果有人将某些东西注入到这个数组中? (我们遇到了一些黑客问题,因此我正在浏览所有代码并堵住任何漏洞)。干杯 – daveaspinall

+0

有了这个,你可以确定'$ sanitizedValues'只包含只包含数字的字符串。没有更多,没有更多。 – deceze

+0

非常好,很干净。干杯@deceze和其他所有发布回复的人。 – daveaspinall

1
foreach($array as $key => $value) { 
    $array[$key] = (int) $value; 

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

POST数据永远不是'int',它都是字符串。 – deceze

+0

这看起来像数字: 阵列 ( [0] => 13 [1] => 12 ) – MasterCassim

+1

是的,但它们是* *字符串,不'int's。 – deceze

3

另一种方法是使用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) 
} 
*/ 
+0

更详细但技术上更合适。 +1 :) – deceze

+0

对不起大家,两者有什么区别? – daveaspinall

+0

如果这是一个你正在验证的领域,我认为这只是一个品味问题。虽然如果你有很多验证过滤器的功能可以节省你一些工作(例如参见[filter_input_array](http://php.net/manual/function.filter-input-array.php))。我猜,如果你或其他人必须了解你在3个月后做了什么,过滤器功能会更清楚地显示发生了什么。 – Yoshi