declarações preparadas são muito úteis contra injecções SQL.
Instruções preparadas e parâmetros Vinculadas
Uma instrução preparada é um recurso usado para executar as mesmas (or similar) as instruções SQL repetidamente com alta eficiência.
declarações preparadas trabalham basicamente assim:
- Preparar: Um modelo de instrução SQL é criada e enviada ao banco de dados. Certos valores não são especificadas, chamados de parâmetros (labeled "?") . Exemplo: INSERT INTO MyGuests VALUES(?, ?, ?)
- O banco de dados analisa, compila e executa otimização de consultas no modelo de instrução SQL, e armazena o resultado sem executá-lo
- Execute: Em um momento posterior, a aplicação liga-se os valores para os parâmetros, eo banco de dados executa a instrução. O aplicativo pode executar a declaração tantas vezes quanto ele quer com valores diferentes
Comparado ao executar instruções SQL diretamente, declarações preparadas têm duas vantagens principais:
- Declarações preparadas reduz o tempo de análise como a preparação em que a consulta é feita apenas uma vez (although the statement is executed multiple times)
- parâmetros vinculados minimizar a largura de banda para o servidor como você precisa enviar apenas os parâmetros de cada vez, e não toda a consulta
- declarações preparadas são muito úteis contra injecções SQL, porque os valores dos parâmetros, que são transmitidos mais tarde utilizando um protocolo diferente, não precisam de ser correctamente escapou. Se o modelo de declaração original não é derivado de entrada externa, injeção de SQL não pode ocorrer.
Declarações preparadas em MySQLi
O exemplo que se segue utiliza as declarações preparadas e parâmetros de limite em MySQLi:
Exemplo (MySQLi with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDB";
// Create connection
$conn = new mysqli($servername,
$username, $password, $dbname);
// Check connection
if ($conn->connect_error)
{
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname,
$email);
// set parameters and execute
$firstname = "John";
$lastname
= "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname
= "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
linhas de código para explicar a partir do exemplo acima:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
No nosso SQL, nós inserimos um ponto de interrogação (?) Onde queremos substituir em um integer, string, o valor de casal ou blob.
Então, ter um olhar para o bind_param() função:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Esta função liga os parâmetros para a consulta SQL e diz ao banco de dados de quais são os parâmetros. O "sss" argumento lista os tipos de dados que os parâmetros são. O personagem s diz mysql que o parâmetro é uma cadeia.
O argumento pode ser um dos quatro tipos:
- i - inteiro
- d - double
- s - corda
- b - BLOB
Devemos ter um destes para cada parâmetro.
Ao dizer mysql que tipo de dados que esperar, nós minimizar o risco de injeções SQL.
Nota: Se desejar inserir quaisquer dados de fontes externas (like user input) , é muito importante que os dados são higienizados e validado.
Demonstrações preparado no DOP
O exemplo que se segue utiliza as declarações preparadas e parâmetros de limite em DOP:
Exemplo (PDO with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname",
$username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
// prepare sql and bind
parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname',
$lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname =
"John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>