SQLite - injeção
Se você pegar a entrada do usuário por meio de uma página da Web e inseri-la em um banco de dados SQLite, há uma chance de você ter se deixado vulnerável a um problema de segurança conhecido como SQL Injection. Neste capítulo, você aprenderá como ajudar a evitar que isso aconteça e ajudá-lo a proteger seus scripts e instruções SQLite.
A injeção geralmente ocorre quando você pede a entrada de um usuário, como seu nome, e em vez de um nome, eles fornecem uma instrução SQLite que você executará inadvertidamente em seu banco de dados.
Nunca confie nos dados fornecidos pelo usuário, processe esses dados somente após a validação; como regra, isso é feito por correspondência de padrões. No exemplo a seguir, o nome de usuário é restrito a caracteres alfanuméricos mais sublinhados e a um comprimento entre 8 e 20 caracteres - modifique essas regras conforme necessário.
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
$db = new SQLiteDatabase('filename');
$result = @$db->query("SELECT * FROM users WHERE username = $matches[0]");
} else {
echo "username not accepted";
}
Para demonstrar o problema, considere este trecho -
$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username = '{$name}'");
A chamada de função deve recuperar um registro da tabela de usuários onde a coluna de nome corresponde ao nome especificado pelo usuário. Sob circunstâncias normais,$nameconteria apenas caracteres alfanuméricos e talvez espaços, como a string ilia. No entanto, neste caso, ao anexar uma consulta inteiramente nova a $ name, a chamada ao banco de dados se transforma em um desastre: a consulta DELETE injetada remove todos os registros dos usuários.
Existem interfaces de bancos de dados que não permitem o empilhamento de consultas ou a execução de várias consultas em uma única chamada de função. Se você tentar empilhar consultas, a chamada falhará, mas SQLite e PostgreSQL, felizmente realizam consultas empilhadas, executando todas as consultas fornecidas em uma string e criando um sério problema de segurança.
Prevenção de injeção de SQL
Você pode lidar com todos os caracteres de escape de forma inteligente em linguagens de script como PERL e PHP. Linguagem de programação PHP fornece a funçãostring sqlite_escape_string() para escapar de caracteres de entrada que são especiais para SQLite.
if (get_magic_quotes_gpc()) {
$name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");
Embora a codificação torne seguro inserir os dados, ela renderizará comparações de texto simples LIKE cláusulas em suas consultas inutilizáveis para as colunas que contêm os dados binários.
Note - addslashes()NÃO deve ser usado para citar suas strings para consultas SQLite; isso levará a resultados estranhos ao recuperar seus dados.