Vă mulțumim pentru susținere

Ce trebuie să scape când trimit o interogare?

Când executați o interogare SQL, trebuie să vă curățați șirurile sau utilizatorii pot executa SQL rău intenționat pe site-ul dvs. Web.

Eu de obicei am doar o funcție escape_string (blah), care:

  • Înlocuiește evadări ( \ ) cu evadări dublu ( \\ ).
  • Înlocuiește ghilimele simple ( ') cu un citat escape ( \' ).

Este aceasta adecvată? Există o gaură în codul meu? Există o bibliotecă care poate face asta rapid și fiabil pentru mine?

Aș dori să văd soluții grațioase în Perl, Java și PHP.

0
adăugat editat
ceva trebuie să fi greșit în afișarea backslash-urilor, în linia Înlocuiește escapes () cu evadări duble (\).
adăugat autor bart

10 răspunsuri

Nu sunt sigur dacă MySql acceptă interogări parametrizate, dacă da, trebuie să depuneți eforturi pentru a merge pe acest traseu. Acest lucru va asigura că utilizatorii nu pot face nimic rău intenționat.

În caz contrar, unele caractere "rele" în plus față de ceea ce ați menționat vor fi punct și virgulă (;) și comentarii (- și / * * /).

0
adăugat

Un lucru minunat de utilizat în PHP este DOP . Este nevoie de o mulțime de presupuneri de a se ocupa de securizarea SQL (și toate chestiile dvs. SQL în general). Acesta susține declarații pregătite, care merg foarte departe spre atenuarea atacurilor SQL Injection.

A great primer on PDO is included in the book The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed. Makes learning a breeze and is excellent as a reference. I don't even have to think about anything other than the actual SQL Query anymore.

0
adăugat

Pentru securitate maximă, performanță și corectitudine, folosiți declarații pregătite. Iată cum puteți face acest lucru cu multe exemple în diferite limbi, inclusiv PHP:

https://stackoverflow.com/questions/1973/ ce-este-the-best-way-to-Evitați-sql-injectare-atacuri

0
adăugat

Mi-ar scuza, de asemenea, comentariile (dublă linie)

--
0
adăugat

În PHP, îl folosesc pe acesta și voi aprecia orice comentariu despre el:

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

Necesită încă o verificare dacă un câmp poate fi 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}';
    ";

That's it enjoy ! (hope the post will correctly send underscores and not _ ;)

0
adăugat

Utilizați interogări pregătite / parametrizate!

0
adăugat

Ești mai bine să folosiți declarații pregătite cu substituenți. Folosiți PHP, .NET ... oricum, declarațiile pregătite vor oferi mai multă siguranță, dar aș putea oferi o mostră.

0
adăugat

API-ul MySQL C are propriul său mysql_escape_string () . Folosirea sau echivalentul ar fi cea mai bună.

0
adăugat

Ce limbă folosiți? Se pare că aproape toți dintre ei au built-in funcții de evacuare SQL care ar fi mai bine de utilizat.

De exemplu, PHP are mysql_real_escape_string și < a href = "http://us2.php.net/manual/en/function.addslashes.php" rel = "nofollow noreferrer"> adaugă-lăgări .

0
adăugat

În interogarea MySQL, atunci când utilizați LIKE, asigurați-vă că ați scăpat de caracterele "_" deoarece nu este scăpat de mysql_real_escape_string.

Pentru referință, consultați aici

0
adăugat