Domanda

Quando esegui una query SQL, devi pulire le stringhe altrimenti gli utenti potrebbero eseguire SQL dannoso sul tuo sito web.

Di solito ho solo una funzione escape_string(blah), che:

  • Sostituisce gli escape (\) con doppie uscite (\\).
  • Sostituisce le virgolette singole (') con una virgoletta singola con escape (\').

È adeguato?C'è un buco nel mio codice?Esiste una biblioteca che può farlo in modo rapido e affidabile per me?

Mi piacerebbe vedere soluzioni graziose in Perl, Java e PHP.

È stato utile?

Soluzione

Per la massima sicurezza, prestazioni e correttezza, utilizzare dichiarazioni preparate.Ecco come farlo con molti esempi in diverse lingue, incluso PHP:

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

Altri suggerimenti

Eviterei anche i commenti (doppio trattino)

--

Un'ottima cosa da usare in PHP è il file DOP.Ci vogliono molte congetture per gestire la protezione del tuo SQL (e di tutte le tue cose SQL in generale).Supporta istruzioni preparate, che contribuiscono notevolmente a contrastare gli attacchi SQL Injection.

Nel libro è incluso un ottimo manuale sulla DOP The PHP Anthology 101 consigli, trucchi e hack essenziali di Davey Shafik ecc.2a edizione.Rende l'apprendimento un gioco da ragazzi ed è eccellente come riferimento.Non devo nemmeno più pensare a nient'altro che all'effettiva query SQL.

Quale lingua stai utilizzando?Sembra che praticamente tutti abbiano funzioni di escape SQL integrate che sarebbe meglio usare.

Ad esempio, PHP ha mysql_real_escape_string E aggiunge barre.

È meglio utilizzare istruzioni preparate con segnaposto.Stai utilizzando PHP, .NET... in ogni caso, le dichiarazioni preparate forniranno maggiore sicurezza, ma potrei fornire un esempio.

In PHP, sto usando questo e apprezzerò ogni commento a riguardo:

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

È necessaria un'altra verifica 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, divertiti!(spero che il post invii correttamente i caratteri di sottolineatura e non _)

Utilizza query preparate/parametrizzate!

Utilizzare dichiarazioni preparate.

Nella query MySQL, quando usi LIKE, assicurati anche di eseguire l'escape dei caratteri "_" poiché non viene eseguito l'escape di mysql_real_escape_string.

Per riferimento, controlla Qui

l'API MySQL C ha la propria mysql_escape_string().Usarlo o un suo equivalente sarebbe la cosa migliore.

Non sono sicuro che MySql supporti le query parametrizzate, in tal caso dovresti fare uno sforzo per seguire questa strada.Ciò garantirà che l'input dell'utente non possa fare nulla di dannoso.

Altrimenti alcuni caratteri "cattivi" oltre a quelli menzionati sarebbero il punto e virgola (;) e i commenti (-- e /* */).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top