php - ¿Tengo que usar mysql_real_escape_string si vinculo parámetros?
sql-injection mysql-real-escape-string (3)
No, no debes. La combinación de los dos resultará en la aparición de caracteres de escape visibles en sus datos.
Tengo el siguiente código:
function dbPublish($status)
{
global $dbcon, $dbtable;
if(isset($_GET[''itemId'']))
{
$sqlQuery = ''UPDATE '' . $dbtable . '' SET active = ? WHERE id = ?'';
$stmt = $dbcon->prepare($sqlQuery);
$stmt->bind_param(''ii'', $status, $_GET[''itemId'']);
$stmt->execute();
$stmt->close();
}
}
¿Necesito mysql_real_escape_string en este caso o estoy bien?
No, no tiene que escapar del valor (es decir, no, no necesita llamar a mysqli_real_escape_string
) , cuando está utilizando declaraciones preparadas: el motor de DB lo hará por sí mismo.
(En realidad, si estuvieras llamando a mysql_real_escape_string
y estuvieras usando parámetros enlazados, tus cadenas se escaparían dos veces, lo que no sería genial: terminarías con personajes que se escapan por todas partes ...)
Como una nota al margen: sus valores se pasan como enteros (como lo indica el ''ii''
) , por lo que no tendría que llamar a mysql_real_escape_string
, incluso si no estuviera usando declaraciones preparadas: como su nombre lo indica, esta función se utiliza para escapar ... cuerdas.
Para los enteros, generalmente solo uso intval
para asegurarme de que los datos que inyecto en mis consultas SQL realmente sean enteros.
(Pero, como estás utilizando consultas preparadas, una vez más, no tienes que hacer ese tipo de escape)
function dbPublish($status)
{
global $dbcon, $dbtable;
if(isset($_GET[''itemId'']))
{
$sqlQuery = ''UPDATE '' . $dbtable . '' SET active = ? WHERE id = ?'';
$stmt = $dbcon->prepare($sqlQuery);
$stmt->bind_param(''ii'', $status, $_GET[''itemId'']);
$stmt->execute();
$stmt->close();
}
}