2011-10-07 2 views
9

다음 배열을 가지고 있으며의 정수만이 허용되도록이 배열의 유효성을 검사하고 santize하는 것이 가장 좋은 방법을 알고 싶습니다. ? 다음과 같습니다PHP 산틴 화/유효성 검사 배열 배열

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

는 인쇄 할 때 :

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

은 내가 esc_attr이 좀 더 강화 뭔가를하고 싶은 때문에 매우 안전하지 알고있다.

도움이 될 것입니다.

건배,

데이브

+0

이 ... 상관없이의 INT에 –

+0

무엇을 그들 캐스트없는 뭔가가있다 배열을 사용하는 것과 비슷합니까? 답장을 보내 주셔서 감사합니다 – daveaspinall

+0

루프 –

답변

12

$_POST 데이터의 때문에, 당신은 ctype_digit를 확인 할 수 있습니다 (즉, 숫자 만 포함 된 문자열)이 그

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

주 단순히 숫자가 아닌 값을 버립니다.

+0

방금 ​​시도해 보니 모든 사람에게 감사의 말을 전하고 있습니다. 그래도 얼마나 안전한가요? 누군가이 어레이에 무언가를 주입한다면? (우리는 해킹에 대한 몇 가지 문제를 겪었으므로 모든 코드를 통과하고 모든 구멍을 막습니다.) 건배 – daveaspinall

+0

이렇게하면'$ sanitizedValues'에는 숫자 만 들어있는 문자열 만 포함될 수 있습니다. 아무것도 더, 아무것도 덜. – deceze

+0

매우 훌륭하고 매우 깨끗합니다. 환호성 응답을 게시 한 모든 사람들과 건배. – 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 기능을 사용하는 것입니다 : 그것은 그냥 (INT) 만 사용하십시오 문자열 인 경우

$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