2012-07-05 2 views
1

이것은이 질문과 유사합니다 - Are Dynamic Prepared Statements Bad? (with php + mysqli), 그러나 4 세 이후로 나는 더 많은 최신 답변을 얻고 싶었습니다.동적 준비 진술 - 보안 구멍이 열렸습니까?

필자는 더 많은 copmlex sql 쿼리를 테스트하지는 않았지만 단순한 sql 쿼리에서는 실패하지 않고 작업을 수행했다.하지만 그렇게하면 주 메뉴 중 하나를 건너 뛸지 잘 모르겠다. 준비된 진술의 이유 - 보안.

나는 bind_result이 다소 까다 롭습니다 만 bind_param 문과 함께 충분히 쉬워 진 call_user_func_array을 사용했습니다. 원래는 get_result을 사용했지만 내가 사용하지 않은 호스트는 mysqlnd을 사용할 수 없었지만 메타 데이터를 사용하여 해결할 수있었습니다. 이것은 제가 작성한 전체 수업입니다.

안전하다고 생각하십니까? 숫자 전달

은 :

  • $sql는 SQL 문에 전달됩니다

    SELECT * FROM users WHERE id = ? AND created_timestamp > ? 
    
  • $mysqli가 mysqli 연결

  • $para 인 제조에 자리이고 성명 :

    array ($types = 'ii', 23, 1235376000) 
    

클래스 :

class crudModel { 
    function ps($sql, $mysqli, $para) { 
     //this function should work for just about any simple mysql statement 
     //for more complicated stuff like joins, unions etc,. we will see 
     if ($prep = $mysqli->prepare($sql)) { 
      call_user_func_array(array($prep, 'bind_param'), $this->makeValuesRef($para, $mysqli)); 
      $prep->execute(); 
      $meta = $prep->result_metadata(); 
      while ($field = $meta->fetch_field()) { 
       $parameters[] = &$row[$field->name]; 
      } 
      call_user_func_array(array($prep, 'bind_result'), $parameters); 
      while ($prep->fetch()) { 
       foreach ($row as $key=>$val) { 
        $x[$key] = $val; 
       } 
       $data[] = $x; 
      } 
      return $data; 
     } 
    } 

    function makeValuesRef($array, $mysqli) { 
     $refs = array(); 
     foreach($array as $key => $value) { 
      $array[$key] = $mysqli->real_escape_string($value); //i don't think escaping is necessary, but it can't hurt (??) 
      $refs[$key] = &$array[$key]; 
     } 
     return $refs; 
    } 
} 
+0

어디에서'$ sql'이 시작 되었습니까? – eggyal

+0

mysqli 대신 PDO를 사용하면 PDO 객체 계층이 MySql뿐 아니라 대부분의 DBMS와 호환되므로 코드가 더 이식성이 높아집니다. –

+0

다른 클래스의 $ sql. 당분간 나는이 클래스를 테스트하기 위해 간단한 SQL 문을 사용했다. 조인은 내가 사용 해본 가장 복잡한 것들이다. 즉 $ sql = "SELECT * FROM users INNER JOIN ON (users.id = others.user_id) WHERE others.id =?" –

답변

1

당신이 여기서하고있는 것은 동적 준비된 명령문이 아니다. 당신은 MySQLi API (짜증나는) 위에 몇 가지 합성 설탕을 넣는 것뿐입니다.

간략히 말하자면 여기에 표시된 코드에는 보안 문제가 없습니다. 사실, 이런 종류의 연습은 꽤 좋습니다. 왜냐하면 나중에 (MySQLi API가 빠르기 때문에) 당신이 정확하게 그것을하고 있는지를 쉽게 확인하기 때문입니다.

그럼 괜찮습니다. 나는 당신이 쿼리를 생성하고있는 영역에 대해 걱정할 것이고, 당신이 우연히 화이트 리스팅없이 그들에게 사용자 데이터를 넣지 않도록 보장 할 것입니다 ...

관련 문제