filter_var php tabanlı mysql sorguları için tamsayı girdiyi yeterli mi?

3 Cevap php

Ben sarma sevdim hiç

mysql_real_escape_string

function around input I expect to be integer for inclusion in a mysql query. Recently I came across the

filter_var

fonksiyonu. Güzel!

Şu anda kodu kullanıyorum:

if (isset($idUserIN) 
    && filter_var($idUserIN, FILTER_VALIDATE_INT) 
    && 0 < filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT)
    ) {
      $idUser = filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT);
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser;
} else {
  // handle invalid data
}

Bu açık herhangi bir delik bırakmak mı?

('> 0' yerine onun bir tablo auto_increment alan olarak '> = 0' den seçilmiş, yani 0 normal bir değeri olmaz)

3 Cevap

Kendimi, bir yerde belki bir statik sınıfta, bu görev için bir işlev yaratacak

  public static function escape_int($i)
  {
     $sanitised = intval($i); 
     if( '_' . $sanitised . '_' === '_' . $i . '_'  && $sanitised > 0 ) 
     {
        return $sanitised;
     }
     throw new IntegerEscapeException( $i, $sanitised );
     return "ENOINT"; # Wont Run This, but I prepare for the impossible. 
  }

try 
{ 
   $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . DB::escape_int( $userid ); 
   DB::query($sql); 
   ...etc...
}
catch( IntegerEscapeException $e )
{ 
   die ( "You shot the sherif!" ); # bad example.
}

Benim sanitasyon yöntemi kokuyor anlarsam daha sonra düzeltmek çünkü bu iyi.

Kullandığım bir çok daha basit ve daha kolay okunan bir yöntem şudur:

$sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . intval($idUser);

Bu bir tamsayı ve benim tablolardan hiçbiri gerçek kimliği yıllardan olarak sahip yetmezliği getirileri 0 dolar idUser dönüştürmeye çalışır. (Bu yüzden 0 olarak değerlendirir eğer giriş geçersiz olduğunu biliyorum.)

Gerçek soruyu yanıtlamak için, hayır bu açık herhangi bir delik bırakmaz. Ama tekrarlayan kod kurtulmak öneririz:

$idUserIN_filtered = filter_var($idUserIN, FILTER_VALIDATE_INT);

if (isset($idUserIN) 
    && $idUserIN_filtered 
    && 0 < $idUserIN_filtered
    ) {
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser_filtered;
} else {
  // handle invalid data
}

Bu ihtiyaç olduğunu

if ($idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) {
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser;
} else {
  // handle invalid data
}

veya

if ($idUser = filter_input(INPUT_POST, 'userId', FILTER_VALIDATE_INT)) {

MVC onun geçersiz Alternatif kontrol edebilirsiniz.

if (!$idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) {
      throw new InputParameterException('UserId');
}
//else its valid