Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Diferença entre real_escape_string e prepare()?


O escape é tão eficaz na defesa de injeção de SQL quanto o uso de parâmetros de consulta.

Ambos os métodos também são menos eficazes se você não os fizer de forma consistente.

Ambos os métodos são úteis apenas para proteger valores individuais em expressões SQL. Eles não suportam outras partes dinâmicas da consulta. Por exemplo, se você deseja ORDER BY uma coluna especificada pelo usuário. Nem os parâmetros de consulta nem as funções de escape lidam com isso.

Então, basicamente, é uma questão de estilo e preferência pessoal.

Eu prefiro parâmetros de consulta porque acho que:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

É mais claro do que isso:
$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);

Você não pode estar dizendo seriamente isso brincando com todas aquelas aspas abertas/aspas fechadas e . a concatenação de strings é mais fácil do que usar prepare() com parâmetros de consulta.

Re seus comentários sobre uma hipotética query() função com parâmetros.

Em primeiro lugar, não é necessário. Usar prepare() e execute() juntos é um pequeno preço a pagar para escrever código seguro e, ao insistir em fazê-lo com uma única função, você parece preguiçoso. Suponho que você não verifique o valor de retorno de funções que retornam false no erro, também?

Para o que vale a pena, seria fácil escrever uma função wrapper para fazer as duas coisas, porque o PHP suporta varargs implicitamente.
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.
}