PHP에서 모든 배열 인덱스를 확인하는 것이 실제로 얼마나 중요합니까?

StackOverflow https://stackoverflow.com/questions/5006796

문제

저는 다음과 같은 코드가 존재하는 곳이 많은 꽤 큰 프로젝트를 진행하고 있습니다.

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

}
도움이 되었습니까?

해결책

사용하면 기능을 많이 단순화 할 수 있습니다.

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;
.

Showed Position에서의 isset () 점검은 완전히 쓸모없는 것처럼 보입니다.변수가 이미 정의되었습니다.

다른 팁

는 그러한 하드 코딩 된 기능을 전혀 갖추어야합니까?

나는 이것을 사용한다 :

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);
.

예, 배열 인덱스나 변수가 존재하지 않으면 PHP는 경고/알림을 제공합니다.

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

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

존재하거나 존재하지 않을 수도있는 인덱스를 확인해야합니다.그러나 코드는 매우 혼란스럽고 실제 코드가 아마 완전히 다른 것처럼 보입니다.이 예제 코드에서는 키가 분명히 존재합니다. 방금 직접 작성했습니다.

  1. 예제에서는 변수를 확인한 경우 MySQL_REAL_ESCAPE_STRING 부분을 이동할 수 있습니다. 이미 알고 있습니다.

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

  3. XSS-Protection (HTMLTentities ()은 예제와 같이 저장하기 전에 데이터를 삭제하기 전에 충분하지 않아야합니다.한 가지 이유는 여러 번 인코딩 / 이스케이프 된 것들을 끝낼 것입니다.악의적 인 HTML / JS는 데이터베이스에서 해를 끼치 지 않습니다.

프로젝트가 매우 크면 정의되지 않은 인덱스는 사용자 입력에 의해 생성 된 데이터를 보유하고 특히 스택 추적을 사용하여 좋은 오류보고가없는 경우 특히 라인을 누적 할 수 있습니다. 이는 데이터가 요청간에 데이터가 손에 닿으면 원래 항목의 원래 지점에서 설정되었음을 보장하지 않으므로 NULL 또는 비어있는 값에 대해 많은 중복 확인을 수행합니다.

여기에서 수행하려는 것이 여기에 수행하려는 것이 객체 로이 기능을 수행함으로써 더 잘 수행되지 않을 수도 있습니다. $ A $ B와 $ C로 표시하는 값은 객체 속성으로 쉽게 만들 수 있으며 하나의 SAVE () 메서드는 상태를 데이터베이스에 저장할 수 있습니다.

이외에 foreach 루프를 사용하여 확인을 훨씬 빨리 수행하고 훨씬 더 일관되게 수행 할 수 있습니다. 키로 데이터를 반복하고 루프 본문 내에서 실제 이스케이프 및 HTMLEntities를 수행하십시오.

http://php.net/manual/en/controctures. foreach.php

또한 매우 자주 HTMLENTITES에 대한 HTMLPURIFIER에 대해 HTMLENTITES가 부유하지 않으므로 특히 웹 응용 프로그램 내에 배치 할 사용자 컨텐츠를 수락하는 공개 양식입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top