Co muszę uciec podczas wysyłania zapytania?

głosy
18

Podczas wykonywania zapytania SQL, trzeba oczyścić swoje struny lub użytkownik może wykonać dowolny kod SQL na swojej stronie.

Zwykle wystarczy mieć escape_string funkcyjny (bla), która:

  • Zastępuje ucieczek ( \) z podwójnymi ucieczek ( \\).
  • Zastępuje apostrofów ( ') z zbiegłego pojedynczy cudzysłów ( \').

Czy to właściwe? Czy istnieje dziura w moim kodu? Czy istnieje biblioteka, która może to zrobić szybko i niezawodnie do mnie?

Chciałbym zobaczyć zgrabne rozwiązania w Perl, Java i PHP.

Utwórz 05/08/2008 o 19:45
źródło użytkownik
W innych językach...                            


11 odpowiedzi

głosy
0

Który język jest używany? Wydaje się, że prawie wszystkie z nich mają wbudowane funkcje SQL ewakuacyjnych, że lepiej byłoby użyć.

Na przykład, PHP mysql_real_escape_string i addslashes .

Odpowiedział 05/08/2008 o 19:46
źródło użytkownik

głosy
2

Chciałbym również uciec komentarzy (podwójna kreska)

--
Odpowiedział 05/08/2008 o 19:46
źródło użytkownik

głosy
0

Jesteś lepiej wyłączyć za pomocą przygotowanych sprawozdań z symbolami. Używasz PHP, .NET ... tak czy inaczej, przygotowano sprawozdanie zapewni większe bezpieczeństwo, ale mogę zapewnić próbkę.

Odpowiedział 05/08/2008 o 19:48
źródło użytkownik

głosy
-1

Nie jestem pewien, czy MySQL obsługuje kwerend parametrycznych, a jeśli tak, należy dołożyć starań, aby pójść tą drogą. Zapewni to wejście użytkownicy nie mogą zrobić nic szkodliwego.

W przeciwnym razie niektóre „złe” znaków oprócz wymienionych co byłoby średnik (;) i komentarze (- a / * * /).

Odpowiedział 05/08/2008 o 19:49
źródło użytkownik

głosy
0

W PHP, używam ten jeden, a ja doceniam każdy komentarz na jego temat:

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

Potrzebuje jeszcze jedną weryfikację, czy pole może być 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}';
    ";

To wszystko gotowe! (Nadzieję, że post będzie poprawnie wysłać podkreślenia i nie & # 95;)

Odpowiedział 05/08/2008 o 20:21
źródło użytkownik

głosy
1

Wielka rzecz, aby korzystać w PHP jest PDO . To zajmuje dużo zgadywać czynienia z zabezpieczania SQL (i wszystkie swoje rzeczy w ogóle SQL). Wspiera przygotowanych sprawozdań, które przejść długą drogę w kierunku udaremnienie ataków SQL Injection.

Wielki grunt na PDO jest zawarte w książce PZP Anthology 101 Podstawowe porady, Tricks & Hacks Davey Shafik itp 2nd Ed . Sprawia, że uczenie się wiatr i jest doskonała jako odniesienie. I nawet nie trzeba myśleć o niczym innym niż rzeczywiste zapytanie SQL anymore.

Odpowiedział 05/08/2008 o 20:28
źródło użytkownik

głosy
7

Dla zapewnienia maksymalnego bezpieczeństwa, wydajności i poprawności użyć przygotowanych sprawozdań. Oto jak to zrobić z dużą ilością przykładów w różnych językach, w tym PHP:

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

Odpowiedział 05/08/2008 o 20:38
źródło użytkownik

głosy
0

Użyj Przetwory / Sparametryzowana zapytań!

Odpowiedział 05/08/2008 o 20:55
źródło użytkownik

głosy
0

MySQL C API ma własną mysql_escape_string(). Korzystanie z niego lub jego odpowiednikiem byłby najlepszy.

Odpowiedział 14/08/2008 o 18:59
źródło użytkownik

głosy
0

Użyj przygotowanych sprawozdań.

Odpowiedział 16/09/2008 o 22:14
źródło użytkownik

głosy
0

W zapytaniu MySQL przy użyciu LIKE, a także upewnić się, aby uniknąć znaki „_”, ponieważ nie jest uciekł przez mysql_real_escape_string.

Dla porównania, sprawdź tutaj

Odpowiedział 14/10/2008 o 05:57
źródło użytkownik

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