2008-08-05 21 views
18

Po wykonaniu zapytania SQL należy wyczyścić ciągi lub użytkownicy mogą wykonać złośliwy kod SQL w witrynie.Czego potrzebuję, aby uciec przed wysłaniem zapytania?

ja zwykle po prostu mieć funkcję escape_string (bla), która:

  • zastępuje ucieczek (\) z podwójnymi ucieczek (\\).
  • Zamienia pojedyncze cudzysłowy (') z pojedynczą kwotowaną sekwencją (\').

Czy to wystarczy? Czy w moim kodzie jest dziura? Czy istnieje biblioteka, która może zrobić to szybko i niezawodnie dla mnie?

Chciałbym zobaczyć pełne wdzięku rozwiązania w języku Perl, Java i PHP.

+0

coś musiało pójść nie tak w wyświetlaczu ukośniki w linii 'Zastępuje ucieczek() z podwójnymi ucieczek (\).' – bart

Odpowiedz

0

Jakiego języka używasz? Wygląda na to, że prawie wszystkie z nich mają wbudowane funkcje ewakuacyjne SQL, których lepiej użyć. Na przykład: PHP ma mysql_real_escape_string i addslashes.

2

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

-- 
0

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

-1

Nie jestem pewien, czy MySql obsługuje sparametryzowane zapytania, jeśli tak, należy podjąć wysiłek, aby przejść tę trasę. Zapewni to, że użytkownicy nie będą w stanie zrobić nic złośliwego.

W przeciwnym razie niektóre "złe" znaki oprócz tego, o którym wspomniałeś, będą średnikami (;) i komentarzami (- i/* * /).

0

W PHP, używam ten jeden, a ja doceniam każdy komentarz o tym:

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 jest to cieszyć się ! (mam nadzieję, że post poprawnie prześle podkreślenia, a nie & # 95;)

1

Wspaniałą rzeczą do wykorzystania w PHP jest PDO. Wymaga to dużo pewności co do zabezpieczenia twojego kodu SQL (i wszystkich twoich danych SQL w ogóle). Obsługuje przygotowane instrukcje, które stanowią długą drogę do udaremnienia ataków SQL Injection.

Wielki podkład na ChNP jest zawarty w książce The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed. Sprawia, że ​​nauka bryza i jest doskonała jako odniesienie. Nie muszę już myśleć o niczym innym, niż o aktualnym zapytaniu SQL.

0

zużyć/Parametryzowane zapytań!

0

MySQL C API ma swój własny mysql_escape_string(). Używanie go lub jego odpowiednika byłoby najlepsze.

0

Użyj przygotowanych wyciągów.

0

W zapytaniu MySQL, podczas używania LIKE, należy również unikać znaków "_", ponieważ nie jest to znak mysql_real_escape_string.

Dla porównania, sprawdź here