Di cosa ho bisogno di scappare quando si invia una query?

voti
18

Quando si esegue una query SQL, è necessario pulire le corde o gli utenti possono eseguire SQL dannoso sul tuo sito web.

Io di solito basta avere una funzione escape_string (bla), che:

  • Sostituisce fughe ( \) con doppie fughe ( \\).
  • Sostituisce virgolette singole ( ') con un apostrofo escape ( \').

È questo un adeguato? C'è un buco nel mio codice? C'è una biblioteca che può fare questo rapido e affidabile per me?

Mi piacerebbe vedere soluzioni graziose Perl, Java e PHP.

È pubblicato 05/08/2008 alle 19:45
fonte dall'utente
In altre lingue...                            


11 risposte

voti
7

Per la massima sicurezza, le prestazioni e la correttezza utilizzare le istruzioni preparate. Ecco come farlo con un sacco di esempi in diverse lingue, tra cui PHP:

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

Risposto il 05/08/2008 a 20:38
fonte dall'utente

voti
2

Vorrei anche sfuggire commenti (doppio trattino)

--
Risposto il 05/08/2008 a 19:46
fonte dall'utente

voti
1

Una grande cosa da utilizzare in PHP è il DOP . Ci vuole un sacco di congetture di trattare con sicuro il vostro SQL (e tutte le tue cose SQL in generale). Esso supporta le istruzioni preparate, che vanno un lungo cammino verso contrastare attacchi di SQL Injection.

Un grande primer su PDO è incluso nel libro Il PHP Antologia 101 consigli essenziali, trucchi e Hacks di Davey Shafik ecc 2nd Ed . Rende l'apprendimento un gioco da ragazzi ed è eccellente come riferimento. Non hanno nemmeno bisogno di pensare a qualcosa di diverso rispetto a quella reale query SQL più.

Risposto il 05/08/2008 a 20:28
fonte dall'utente

voti
0

In query MySQL, quando si utilizza LIKE, anche fare in modo di sfuggire ai caratteri "_" in quanto non è sfuggito dalla mysql_real_escape_string.

Per avere un riferimento, controllare qui

Risposto il 14/10/2008 a 05:57
fonte dall'utente

voti
0

Utilizzare le istruzioni preparate.

Risposto il 16/09/2008 a 22:14
fonte dall'utente

voti
0

l'API C di MySQL ha il proprio mysql_escape_string(). Usandolo o è equivalente sarebbe meglio.

Risposto il 14/08/2008 a 18:59
fonte dall'utente

voti
0

Utilizzare query preparate / con parametri!

Risposto il 05/08/2008 a 20:55
fonte dall'utente

voti
0

In PHP, sto usando questo e io apprezzare ogni commento su di esso:

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}; 
";

Ha bisogno di una verifica più se un campo può essere NULL:

$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}';
    ";

Questo è tutto godere! (Spero che il post verrà inviare correttamente sottolineatura e non & # 95;)

Risposto il 05/08/2008 a 20:21
fonte dall'utente

voti
0

È meglio utilizzare istruzioni preparate con segnaposto. Si sta utilizzando PHP, .NET ... in entrambi i casi, istruzioni preparate fornirà maggiore sicurezza, ma potrebbe fornire un campione.

Risposto il 05/08/2008 a 19:48
fonte dall'utente

voti
0

Quale lingua stanno usando? Sembra che quasi tutti loro hanno funzioni built-in SQL di fuga che sarebbe meglio utilizzare.

Ad esempio, PHP ha mysql_real_escape_string e addslashes .

Risposto il 05/08/2008 a 19:46
fonte dall'utente

voti
-1

Non sono sicuro se MySQL supporta le query con parametri, in caso affermativo, si dovrebbe fare uno sforzo di seguire questa strada. Questo garantisce che il contributo degli utenti non può fare nulla dannoso.

In caso contrario, alcuni personaggi "cattivi" in aggiunta a quello che lei ha citato sarebbe virgola (;) e commenti (- e / * * /).

Risposto il 05/08/2008 a 19:49
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more