Pergunta

Quando você executa uma consulta SQL, você tem que limpar suas cadeias de caracteres ou os usuários podem executar SQL malicioso no seu website.

Eu geralmente só tem uma função escape_string(blá), que:

  • Substitui escapa (\) com dupla escapa (\\).
  • Substitui aspas simples (') com um escaparam aspas simples (\').

É esta adequada?Há um buraco no meu código?Existe uma biblioteca que pode fazer isso de forma rápida e confiável para mim?

Eu gostaria de ver graciosa soluções em Perl, Java e PHP.

Foi útil?

Solução

Para máxima segurança, o desempenho e a correção usar prepared statements.Veja como fazer isso com um monte de exemplos em diferentes linguagens, incluindo o PHP:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Outras dicas

Eu gostaria também de escape comentários (traço duplo)

--

Uma grande coisa para usar no PHP é o DOP.Ele tem um monte de conjecturas fora de lidar com a segurança de seu SQL (e todas as suas SQL coisas em geral).Ele suporta instruções preparadas, que percorrer um longo caminho para frustrar Ataques de Injeção de SQL.

Um ótimo primer no DOP está incluído no livro O PHP Antologia 101 Dicas Essenciais, Truques & Hacks Davey Shafik, etc.2ª Ed.Faz a aprendizagem de uma brisa e é excelente como uma referência.Eu não tenho que pensar em nada diferente do real Consulta SQL mais.

O idioma que está a utilizar?Parece que praticamente todos eles têm construído-em SQL funções de escape que seria melhor para usar.

Por exemplo, o PHP tem mysql_real_escape_string e addslashes.

Você é melhor fora de usar instruções preparadas com marcadores de posição.Você está usando PHP, .NET...de qualquer forma, instruções preparadas vai proporcionar mais segurança, mas eu poderia dar um exemplo.

Em PHP, eu estou usando este e eu aprecio todos os comentários sobre o assunto :

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
        $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
        $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
}


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
";

Precisa mais uma verificação se um campo pode ser NULO :

$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';


if(is_null($picture)) 
    $p = 'NULL'; 
else
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant);

$requete = "SELECT * FROM Students
    WHERE IdStudent={$IdS} AND
    PictureStudent={$p} AND
    NameStudent='{$Name}';
    ";

É isso aproveite !(espero que o post irá enviar corretamente os sublinhados e não _ ;)

Use Preparado/consultas Parametrizadas!

Usar prepared statements.

No MySQL query, quando usando COMO, também certifique-se de que, para fugir da "_" caracteres como ele não é ignorado por mysql_real_escape_string.

Para referência, seleção aqui

o MySQL API C tem a sua própria mysql_escape_string().Usando ou equivalente seria melhor.

Eu não tenho certeza se o MySql suporta consultas parametrizadas, se assim for, você deve fazer um esforço para ir por esse caminho.Isto irá assegurar a entrada de usuários não pode fazer nada malicioso.

Do contrário, alguns "bad" caracteres além do que você mencionou seria o ponto-e-vírgula (;) e comentários (-- e /* */).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top