sql >> Base de Datos >  >> RDS >> Mysql

¿Diferencia entre real_escape_string y prepare()?

Escapar es tan efectivo en la defensa de inyección SQL como usar parámetros de consulta.

Ambos métodos también son menos efectivos si no los aplica de manera constante.

Ambos métodos son útiles solo para proteger valores individuales en expresiones SQL. No admiten otras partes dinámicas de la consulta. Por ejemplo, si desea ORDENAR POR una columna especificada por el usuario. Ni los parámetros de consulta ni las funciones de escape manejan eso.

Básicamente, es una cuestión de estilo y preferencia personal.

Prefiero los parámetros de consulta porque pienso esto:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

Es más claro que esto:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);

No puedes estar diciendo eso en serio jugando con todas esas comillas abiertas/cerradas y . la concatenación de cadenas es más fácil que usar prepare() con parámetros de consulta.

Vuelva a sus comentarios sobre una hipotética query() función con parámetros.

En primer lugar, no es necesario. El uso conjunto de prepare() y execute() es un pequeño precio a pagar por escribir código seguro, y al insistir en hacerlo con una sola función, suena perezoso. Supongo que no verifica el valor de retorno de las funciones que devuelven false por error, ¿tampoco?

Si sirve de algo, sería fácil escribir una función contenedora para hacer ambas cosas, porque PHP admite varargs implícitamente.

function myquery() {
  global $pdo;
  $params = func_get_args();
  $sql = array_shift($params);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($params);
  return $stmt; // so we can fetch(), etc.
}