2011-02-15 6 views
1

다음과 같은 코드가있는 꽤 큰 프로젝트에서 작업하고 있습니다.PHP에서 모든 배열 인덱스를 확인하는 것이 얼마나 중요합니까?

function foo($a, $b, $c, $d, $e, $f) { 
    $clean = array(); 
    $mysql = array(); 

    $clean['a'] = htmlentities($a); 
    $clean['b'] = htmlentities($b); 
    $clean['c'] = htmlentities($c); 
    $clean['d'] = htmlentities($d); 
    //... 

    $mysql['a'] = mysql_real_escape_string($clean['a']); 
    $mysql['b'] = mysql_real_escape_string($clean['b']); 
    $mysql['c'] = mysql_real_escape_string($clean['c']); 
    $mysql['d'] = mysql_real_escape_string($clean['d']); 
    //... 

    //construct and execute an SQL query using the data in $mysql 
    $query = "INSERT INTO a_table 
       SET a='{$mysql['a']}', 
        b='{$mysql['b']}', 
        c='{$mysql['c']}', 
        d='{$mysql['d']}'"; 
} 

분명히 정의되지 않은 인덱스에 대해 PHP에서 많은 경고가 발생합니다.

다음과 같이 코드를 다시 작성해야합니까?

function foo($a, $b, $c, $d, $e, $f) { 
    $clean = array(); 
    $mysql = array(); 

    $clean['a'] = htmlentities($a); 
    $clean['b'] = htmlentities($b); 
    $clean['c'] = htmlentities($c); 
    $clean['d'] = htmlentities($d); 
    //... 

    $mysql['a'] = (isset($clean['a'])) ? mysql_real_escape_string($clean['a']) : mysql_real_escape_string($a); 
    $mysql['b'] = (isset($clean['b'])) ? mysql_real_escape_string($clean['b']) : mysql_real_escape_string($b); 
    $mysql['c'] = (isset($clean['c'])) ? mysql_real_escape_string($clean['c']) : mysql_real_escape_string($c); 
    $mysql['d'] = (isset($clean['d'])) ? mysql_real_escape_string($clean['d']) : mysql_real_escape_string($d); 
    //... 

    //construct and execute an SQL query using the data in $mysql 
    if (isset($mysql['a']) and isset($mysql['b']) and isset($mysql['c']) and isset($mysql['d'])) { 
     $query = "INSERT INTO a_table 
        SET a='{$mysql['a']}', 
         b='{$mysql['b']}', 
         c='{$mysql['c']}', 
         d='{$mysql['d']}'"; 
    } 

} 
+1

글쎄, 모든'$ clean [ 'something']'을 설정하면주의를주지 말아야한다. Btw, 반복 많이 했어. 루프 또는'array_map'을 사용하는 것을 고려하십시오 : http://php.net/manual/en/function.array-map.php –

답변

1

당신은 당신이 사용하는 경우 많은 함수를 단순화 할 수 있습니다 :

function foo($a, $b, $c, $d, $e, $f) { 

    $args = func_get_args(); // or build an array() manually 

    $args = array_map("htmlentities", $args); 
    $args = array_map("mysql_real_escape_string", $args); 

    list($a, $b, $c, $d, $e, $f) = $args; 

는 isset()을 보였다 위치를 확인하는 것은 완전히 쓸모 보인다. 변수는 이미 정의되어 있습니다.

+0

체크가 무의미 해 보인다고 가정하면 체크를 남겨두면 어떤 위험이 발생합니까? ? 이러한 체크를 추가하는 유일한 이유는 PHP의 불필요한 경고를 방지하는 것일 수도 있습니다. 아니면 잘못된 방식으로 처리 한 것입니까? – Jon

+0

@Jon : htmlentities() 호출은 선택 사항입니다. 따라서 issets()는 통지/경고를 방지하기 위해 존재하지 않았지만 올바른 데이터 소스를 대체 할 수 있습니다. 실제 문제는 IMHO에서 데이터가 체인에서 처리되었을 때 별개의 변수로 보류 된 것처럼 보입니다. – mario

1

하드 코딩 된 기능이 필요합니까?

function insert_array($table, $data) { 
    $cols = '('; 
    $values = '('; 
    foreach ($data as $key=>$value) { 
     $value = mysql_real_escape_string($value); 
     $cols .= "$key,"; 
     $values .= "'$value',"; 
    } 
    $cols = rtrim($cols, ',').')'; 
    $values = rtrim($values, ',').')'; 
    $sql = "INSERT INTO $table $cols VALUES $values"; 
    mysql_query($sql) or die(mysql_error()); 
} 

그런 다음에 관계없이 그 이름의 데이터를 삽입하고, 열 사용 :

나는 이것을 사용하는 배열 인덱스 또는 변수 인 경우

$data = array('id' => 1, 'name' => 'Bob', 'url' => 'foo.com'); 
insert_array('users', $data); 
+0

+1 OMG !! 나는 이런 식으로 생각하지 않는다. 매우 감사한다. 고마워. – enam

+0

유용한 아이디어 (이 경우는 그렇지 않음) - 단순화를 위해 일반적으로 수행하는 추가 데이터 조작을 제거했습니다. 그리고 모든 함수 인수가 반드시 테이블 열과 일치하지는 않습니다. – Jon

1

예,하지 PHP를 줄 존재 경고/주의.

isset() 기능을 사용하기 전에 모든 변수를 확인하는 것이 올바른 방법입니다.

사용하기 전에 확인하는 것이 좋습니다.

+0

이 경우가 아니라면,'$ a, $ b, $ c, $ d'는 정의 된 함수 인수가됩니다. – ajreal

+0

@ajreal : 예, 실제로는 –

0

존재하지 않을 수도있는 색인을 검사해야합니다. 그러나 코드는 매우 혼란스럽고 실제 코드는 완전히 다른 것처럼 보입니다. 이 예제 코드에서는 키가 분명히 존재하며 방금 직접 만들었습니다. 당신이 변수를 확인할 경우, 당신은 이미 그들이 존재한다는 것을 알고있는 경우에 당신의 예에서

  1. , 당신은 내부는 mysql_real_escape_string 부분을 이동할 수 있습니다.

  2. 여기에 배열을 사용할 이유가 없으므로 동일한 변수에 저장할 수 있습니다.

  3. XSS- 보호 (htmltentities()는 충분하지 않습니다)는 데이터를 표시하기 전에 수행해야하며 예와 같이 저장하기 전에 수행해야합니다. 한 가지 이유는 여러 번 인코딩/이스케이프 처리 된 콘텐츠로 끝나게된다는 것입니다. 악의적 인 HTML/JS는 데이터베이스에서 아무런 해를 끼치 지 않습니다. 프로젝트가 매우 큰 경우가 사용자의 입력에 의해 생성 된 데이터를 보유, 특히 스택 추적과보고 좋은 오류의 부재에 특히

0

후 정의되지 않은 인덱스는 선 아래로 악몽이 될 수 있습니다. 이는 요청간에 데이터가 전달 될 때 데이터가 원래의 입력 지점에 설정되었다는 보장이 없으므로 null 또는 빈 값에 대해 중복 검사를 많이하게됩니다.

여기서 수행하려는 작업이 개체로이 기능을 사용하면 더 잘 수행되지 않을 수도 있습니다. $ a $ b와 $ c를 사용하여 표현한 값은 쉽게 객체 속성으로 만들 수 있으며 하나의 save() 메서드를 사용하면 상태를 데이터베이스에 저장할 수 있습니다.

외에도 foreach 루프를 사용하면 더욱 빠르고 훨씬 일관되게 검사를 수행 할 수 있습니다. 해당 키를 사용하여 데이터를 반복하고 루프 본문 내에서 실제 이스케이프 및 htmlentities를 수행하십시오.

http://php.net/manual/en/control-structures.foreach.php

나는 또한 매우 자주, 특히 웹 응용 프로그램 내에 배치 될 사용자 콘텐츠를 받아 공공 형태의, insufficent입니다 htmlentites, 당신의 XSS 필터링 HTMLPurifier을 제안한다.

http://htmlpurifier.org/