¿Filter_Var es suficiente para desinfectar la entrada entera para las consultas MySQL basadas en PHP? -- php campo con mysql campo con validation camp Relacionados El problema

Is filter_var sufficient to sanitise integer input for PHP-based MySQL queries?


1
vote

problema

Español

Nunca me he gustado envolver el

  mysql_real_escape_string    

Función alrededor de la entrada Espero ser entero para su inclusión en una consulta MySQL. Recientemente me encontré con el

  filter_var    

función. ¡Agradable!

Actualmente estoy usando el código:

  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 }   

¿Esto deja algún agujero abierto?

('& gt; 0' elegido en lugar de '& gt; = 0' Como su campo Auto_Inscrement, así que 0 no sería un valor normal)

Original en ingles

I've never liked wrapping the

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  

function. Nice!

I'm currently using the code:

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 } 

Does this leave any holes open?

('> 0' chosen rather than '>= 0' as its a table auto_increment field, so 0 would not be a normal value)

        

Lista de respuestas

2
 
vote

Yo mismo crearía una función para esa tarea, posiblemente en una clase estática en algún lugar,

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

Esto es bueno porque si descubro que mis sucesos del método de saneamiento puedo arreglarlo más tarde.

 

I myself would create a function for that task, possibly in a static class somewhere,

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

This is good because if I discover my sanitation method reeks I can fix it later.

 
 
1
 
vote

Un método mucho más simple y más fácil de leer que uso es esto:

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

Intenta convertir $ Iduser a un entero y en el fracaso devuelve 0 que ninguna de mis tablas tiene la identificación real. (Así que sé que la entrada no era válida si se evalúa a 0.)

Para responder a su pregunta real, no, eso no dejará los agujeros abiertos. Sin embargo, sugiero deshacerme del código repetitivo:

  $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 }   
 

A much simpler and easier-to-read method that I use is this:

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

It attempts to convert $idUser to an integer and on failure returns 0 which none of my tables have as real id's. (So I know the input was invalid if it evaluates to 0.)

To answer your actual question, no that won't leave any holes open. I suggest getting rid of the repetitive code though:

$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 } 
 
 
0
 
vote

Esto es todo lo que necesita

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

o

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

Alternativamente, puede verificar si no es válido en MVC.

  findall()0  

 

This is all you need

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

or

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

Alternatively you can check if its invalid in MVC.

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

Relacionados problema

1499  Se detectó un valor de solicitud potencialmente peligroso. Se detectó valor del cliente  ( A potentially dangerous request form value was detected from the client ) 
Cada vez que un usuario publica algo que contiene < o > En una página en mi aplicación web, recibo esta excepción lanzada. No quiero entrar en la discus...

35  Validación del lado del cliente de ASP.NET  ( Asp net custom client side validation ) 
Tengo una función de validación personalizada en JavaScript en un control de usuario en un sitio web .NET 2.0 que comprueba para ver que la tarifa pagada no e...

2  ¿Son selectones y selectmany opciones limitadas por SelectItems?  ( Are selectone and selectmany choices bounded by selectitems ) 
¿Los controles de SELECTO SELECTO y SelectMany solo permiten la presentación de los valores definidos en los selectos seleccionados dados? Me preocupa la fals...

1  Validación del identificador de recursos internacionales  ( International resource identifier validation ) 
Validación de URIS para RFC 3986 es bastante simple. Puede usar una expresión regular como : /^ # Star...

6  Cómo mostrar los mensajes en InvalidHandler en el validador de jQuery  ( How to display messages in invalidhandler in jquery validator ) 
Estoy tratando de usar el validador de jQuery en un formulario y estoy tratando de averiguar los mensajes de los errores en la opción InvalidHandler (o si hay...

2  Validación de PHP - Pasando los valores de Posts HTTP hacia adelante a un pago de terceros  ( Php validation passing http post values forwards to a 3rd party checkout ) 
No sé si esto es posible, parece que no puedo encontrar ninguna otra guía de ayuda para que esto pueda no ser posible ... Tengo una página de pago que publi...

4  Cancelación de la entrada de la caja de texto en el error de validación en WPF  ( Canceling textbox input on validation error in wpf ) 
Estoy tratando de averiguar cómo cancelar la entrada de usuario en un TextBox cuando se produce un error de validación. Si el usuario intenta ingresar un ca...

1  ASP.NET 2.0 - ¿Validando los controles no vísperos en la misma página?  ( Asp net 2 0 validating nonvisible controls on the same page ) 
Tengo una aplicación que utiliza los controles de los campos de campo requeridos con una validación y una vez que se hace un clic en el botón "Finalizar". Tod...

40  Hacer una expresión regular de la expresión insensible en ASP.NET REGUAREXPRESSIONVALIDADOR  ( Make regular expression case insensitive in asp net regularexpressionvalidator ) 
Dada esta expresión regular: "^[0-9]*s*(lbs|kg|kgs)$" ¿Cómo lo hago en caso insensible? Estoy tratando de usar esto en un validador de expresión regular de ...

44  ¿Cómo determinar si una cadena es válida JSON?  ( How to determine whether a string is valid json ) 
¿Alguien sabe de una robusta (a prueba de viñetas) is_json Función SNIPPET para PHP? Yo (obviamente) tengo una situación en la que necesito saber si una caden...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos