2010-06-30 16 views
6

Entonces, me preguntaba si esto es suficiente para estar seguro de que el usuario no hará ninguna inyección de SQL y el número será único y siempre entero. La función $ id en getArticle está vinculada a la consulta SQL.¿Es (int) y is_int() seguro para proteger contra las inyecciones de SQL?

<?php $id = (isset($_GET['id']) && is_int((int)$_GET['id'])) ? (int)$_GET['id'] : false ?> 
<?php $news = $class->getArticle($id) ?> 

Por lo que he probado, funcionó bien, pero como no estoy del todo seguro, prefiero preguntarte guyz! Ok, la gente dice que las declaraciones preparadas harían el truco. ¿Realmente lo harían? Al igual que, ¿puedo estar totalmente seguro de que si bind param como entero será entero nada más?

¡Gracias de antemano!

+2

Creo que la prueba de 'is_int ((int) [ANYTHING])' siempre devolverá 'true' y, por lo tanto, es redundante. Use 'is_numeric' para probar si algo ** se puede convertir a ** an' int' y luego use '(int)' para llevar a cabo la conversión. O deje el primer paso, ya que (int) creará un 'int' de 0 en valores irreconocibles. – MvanGeest

+0

tenga cuidado si su parámetro $ _GET proviene de un formulario | bool is_int (mixed $ var) | Encuentra si el tipo de la variable dada es entero. Nota: Para probar si una variable es un número o una cadena numérica (como la entrada del formulario, que siempre es una cadena), debe usar is_numeric(). – Redlab

Respuesta

10

Usted puede simplemente escribir echarlos al tipo adecuado:

$number = intval($_GET['id']); 
$string = mysql_real_escape_string(strval($_GET['str'])); 

Para asegurarse de que usted consigue lo que usted está esperando.

La mejor solución es usar Prepared statements para evitar la inyección de sql.

+0

Ref: http://php.net/manual/en/function.mysql-real-escape-string.php –

+7

De acuerdo, ¿por qué no usar simplemente * Declaraciones preparadas * y olvidarse de la comprobación de parámetros? –

+0

Sí, como he dicho, más tarde enlazaré los parámetros a la consulta SQL, pero ¿realmente hará lo que tiene que hacer? Quiero decir: bind_param ('i', $ id); hará el truco? – Rihards

0

No puedo pensar en ninguna forma de cómo esto se puede utilizar para una inyección de SQL. Entonces diría que es lo suficientemente seguro.

0

sólo tiene que utilizar:

$id=(int)@$_GET['id']; 

si $ _GET [ 'id'] no está ajustado $ id será 0.
si desea comprobar si se ha ajustado correctamente Identificación del uso:

if ($id=(int)@$_GET['id']){ 
    // 
} else { 
    //invalid id 
} 
5

Utilice declaraciones preparadas. No hay razón para NO usarlos. Entonces no tienes que preguntar "¿Es esto lo suficientemente bueno?"

+0

Si la entrada se convierte en un número, entonces sé que es "lo suficientemente bueno". Y si es más fácil omitir las declaraciones preparadas (generar consultas con WHERE IN) o más rendimiento (hacer un lote masivo de insertos en una consulta), entonces hay razones para no usarlas. –

Cuestiones relacionadas