2009-09-08 10 views
8

Wszyscy wiemy, że sparametryzowany SQL jest sposobem postępowania przy wprowadzaniu danych przez użytkownika i dynamicznym SQL, ale jest przesyłaniem od napisu do int (lub podwójnego, długiego lub innego), skuteczne, jeśli dane wejściowe, których szukasz, są numeryczne?Ochrona przed iniekcją SQL - przesyłanie od ciągu znaków do int

Zgaduję, o co pytam, czy ta technika jest nieomylna w odniesieniu do wstrzyknięcia SQL?

Odpowiedz

10

Nie jestem ekspertem, ale jestem dość pewny, że to będzie bezpieczne.

Ale dlaczego warto skorzystać? Używaj sparametryzowanego SQL i nie musisz się o to martwić.

Poza tym parametryzowanie kodu SQL ma inne zalety, a nie tylko ochronę przed wtryskiem.

1

Jest bezpieczny pod względem zapobiegania wstrzyknięciu sql, ale nie jest dobrym pomysłem, ponieważ otrzymujesz wyjątek, którego zawsze chcesz uniknąć, jeśli wyjątki są drogie. Powinieneś naprawdę odpowiednio odkażać dane wejściowe. I oczywiście użytkownik może nadal zmieniać wartość do dowolnego zakresu w ramach wartości int32.

2

Jeśli ciąg znaków był prawidłową liczbą, przed odlaniem go do liczby całkowitej tak, jest bezpieczny. Musisz jednak upewnić się, że jest to poprawna liczba całkowita przed przesłaniem jej do int.

Nie wiem, jakiego języka używa serwer, ale w PHP można użyć funkcji is_numeric(). Na przykład:

$strYouExpectToBeInt = $_POST['id']; 
try { 
    if (false === is_numeric($strYouExpectToBeInt)) { 
     throw new Exception('id is not a numeric string or a number'); 
    } 
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt; 
    if (false === is_int($strYouExpectToBeInt)) { 
     throw new Exception('id is not a valid integer'); 
    } 

    // everything is ok, you can use $strYouExpectToBeInt 
    // in SQL query now 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Koleś, dlaczego używasz stałej po lewej stronie? – arthurprs

1

Prawdopodobnie, ale warto testowania.

Odnośnie odpowiedzi Richarda, czasami miałem problemy z IsNumeric() będąc trochę bardziej liberalnym w tym, co zaakceptuje jako numer prawidłowy niż rzeczywisty CAST do numerycznego (w rzeczywistości zależy to od ustawień lokalizacji). Rzeczy takie jak "-0", "3E-5", "5.000.000" czasami spełniają IsNumeric, ale nie są rzucane poprawnie. Zwykle staram się w pełni wypróbować, zamiast tego złapać rzeczywiste oświadczenie.

+0

Tak, dlatego używam również is_int() po rzutowaniu, aby się upewnić. –

Powiązane problemy