Como prevenir injeção de código SQL 30.01.17 3:11
1 - NÃO utilize as funções mysql_* pois as mesmas são consideradas obsoletas (deprecated) e logo serão removidas. Mais alguns motivos para não usá-las.
Utilize prepared statements, isso vai reduzir a vulnerabilidade de sql injection, pois a consulta é dividida em duas partes, o comando sql e as marcações(? ou :nome) que serão substituidos pelos valores, o primeiro é executado já o segundo mesmo contendo uma instrução sql válida será tratado como texto puro.
As marcações não podem substituídas por nomes de databases, tabelas/views, colunas e valores nas clásulas ORDER BY ou GROUP BY.
Existem dois drivers que suportam isso, o PDO e o mysqli.
Exemplo de prepared staments com PDO:
- Código:
$db = new PDO('mysql:host=localhost dbname=teste', 'usuario', 'senha');
$sql = 'INSERT INTO tabela(campo1, campo2, campo3) VALUES(?, ?, ?)';
$stmt = $db->prepare($sql);
$stmt->bindValue(1, 'valor1');
$stmt->bindValue(2, 'valor2');
$stmt->bindValue(3, 'valor3');
$stmt->execute(); // executa o insert ou outra sql
- Código:
$db = new mysqli('localhost', 'usuario', 'senha', 'teste');
$sql = 'INSERT INTO tabela(campo1, campo2, campo3) VALUES(?, ?, ?)';
$stmt = $db->prepare($sql);
if(!$stmt){
echo 'erro na consulta: '. $db->errno .' - '. $db->error;
}
$var1 = 1;
$var2 = 'foo';
$var3 = 1.99;
$stmt->bind_param('isd', $var1, $var2, $var3);
$stmt->execute();
A string isd corresponde aos tipos de dados passados que são integer, string, double e b para campos blob conforme o manual.