2010-01-20 19 views
7

Używam prostego skryptu PHP do uruchomienia komiksu online, który w zasadzie używa GET, aby pobrać wartość całkowitą n i wstawić znacznik img dla n .jpg. Nie przeprowadza żadnych prób odkażania ani sprawdzania błędów poza upewnieniem się, że istnieje n .jpg. Jedyną interakcją użytkownika ze skryptem jest ten GET, a drugi robi to samo z ciągiem, aby ręcznie wyświetlać inny szablon do testowania.Czy powinienem martwić się zastrzykiem PHP, jeśli nie używam MySQL?

Moje pytanie brzmi, czy powinienem się martwić o zastrzyk? A jeśli tak, to co powinienem zrobić, aby temu zapobiec? Wszystko, co znalazłem do tej pory dotyczy tylko wstrzyknięcia MySQL, co nie ma zastosowania w tym przypadku.

+0

PHP może używać innych baz danych niż MySQL, a wstrzyknięcie kodu można wykonać za pomocą dowolnej (?) Bazy danych SQL lub dowolnego kodu oceniającego dane wejściowe z zewnątrz. – PhiLho

Odpowiedz

5

Jeśli nie korzystasz z bazy danych, wtedy oczywiście SQL injection nie jest dla ciebie problemem. Podobnie, jeśli nie przechowujesz żadnych danych przesłanych przez użytkowników, aby wyświetlić je innym użytkownikom, nie jest to problemem. Pozostawia to takie rzeczy jak eval() lub uruchamianie zewnętrznych procesów, które atakujący może przekreślić, ale nie brzmi to tak, jakbyś zrobił coś takiego.

Więc prawdopodobnie jesteś bezpieczny. Mimo to dobrze byłoby mieć minimalną ilość sprawdzania błędów, aby tylko wejść w nawyk. Na przykład mówisz, że masz liczbę całkowitą GET. Nie ma czegoś takiego - wszystkie parametry HTTP są ciągami implicit. PHP rozmywa to rozróżnienie, ale zdecydowanie powinieneś rzucić je do int jawnie, aby upewnić się, że nie jest to jakiś ciąg mający wykorzystać lukę XSS, SQL injection lub eval (nawet jeśli żadna taka nie istnieje).

+0

Ponieważ parametr jest częścią nazwy pliku, jest to po prostu ciąg składający się z cyfr. A ponieważ sprawdzono istnienie wspomnianego pliku, odlewanie byłoby zbędne. Ale normalnie byłby to dobry pomysł. Jak wskazano w odpowiedzi poniżej, 'ctype_digit' powinno wystarczyć, aby zapewnić poprawność danych wejściowych. –

+0

@nikc chodzi o to, że nie można uniemożliwić komuś przesłania żądania zawierającego arbitralnie zmanipulowane wartości parametrów, więc generalnie nie wolno przyjmować żadnych założeń, jakie mogą mieć parametry formularza. –

+0

XSS nadal stanowi problem, nawet jeśli nie przechowujesz danych i nie pokazujesz innym. spójrz na sekcję "Nietrwałe" na stronie wikipedii, którą podłączyłeś do –

3

Powinieneś zawsze martwić się bezpieczeństwem. Nie każda dziura bezpieczeństwa składa się przez niewłaściwym wykorzystaniem mysql :-)

1

Jeśli get ma zawierać jedynie korzystanie całkowitą

$n = intval($_GET['n'])

2

Zastrzyk SQL nie ma zastosowania w przypadku, ponieważ ciebie nie korzystają z bazy danych dla Twojej witryny. Ale powinieneś rozważyć inne problemy z bezpieczeństwem dla swojej strony, takie jak cross site scripting.

Jeśli używasz zmiennej z GET, należy rozważyć poniżej URL:

index.php?myvar=<script>alert(document.cookie);</script> 

Hakerzy są w stanie dostarczyć wyżej adres URL w hex numer sposoby, UTF itd

Zły facet może zmodyfikuj zmienne GET, aby wykonać ataki XSS. XSS jest źródłem wielu luk w zabezpieczeniach. Musisz to również wziąć pod uwagę.

Jeśli spodziewasz typ numeryczny z Twojego GET var następnie rozważyć poniżej kod:

$myvar = (int) $_GET['your_var']; 

Należy użyć htmlentities funkcję, aby zapobiec atakom XSS.

+0

Należy zauważyć, że XSS nie ma znaczenia, gdy potencjalnie złośliwe dane wejściowe są używane jedynie do skonstruowania strony, która ma być wyświetlana temu samemu użytkownikowi. XSS stanowi problem tylko wtedy, gdy dane wejściowe od jednego użytkownika są pokazywane innym. –

+1

@Michael: "XSS jest tylko problemem, gdy dane wejściowe od jednego użytkownika są pokazywane innym". Czy nie byłoby możliwe oszukać innego użytkownika w kliknięciu szkodliwego linku zawierającego kod HTML do wstrzyknięcia? Następnie wstrzyknięty javascript itp. Działa w ich przeglądarce jako oni. –

+1

Zdecydowanie zgadzam się z Tomem Haigh. Łatwo jest oszukać innych w kliknięciu linku. Jeśli mają konto na stronie, a link umożliwia wstrzyknięcie XSS, czy to nietrwałe, to możesz wykonać pobranie zawartości strony i wysłać ją na serwer, lub wywołać funkcje odsłonięte przez stronę, która będzie wykonywana tak jakby zostały wykonane na żądanie użytkownika. Po co zezwalać XSS, jeśli możesz temu zapobiec? –

0

Allways sprawdza dane wprowadzane przez użytkownika oraz dane $ _GET i $ _POST w poszukiwaniu szkodliwej zawartości. Addslashes, ereg_match i intval są twoim przyjacielem ...

Jeśli można uciec z nim, ustawić dyrektywę

allow_url_fopen = Off 

w php.ini

+1

Czy ta dyrektywa nie powinna być wyłączona zamiast ...? –

+0

Whoops :) Naprawiono! – Powertieke

1

Jeśli spodziewasz się numeru, nie odkażaj złych danych wejściowych, odmawiaj.

if (!ctype_digit($user_input)) { 
    header('Location: error.php'); // or whatever page 
    exit; 
} 
+0

Lub po prostu wymuś: printf ("% u", $ _GET ['n']); ' – Svish

+0

Myślę, że to osobisty gust. Nigdy nie zezwalam na złą prośbę, poprawiając ją: jeśli jest ona zła, musi wygenerować błąd. –

0

ja również zwraca hit żądany katalog zdjęć też, jak nie chcą ludzie przeglądania serwer plików wniosków jak example.com/?q=../../.htaccess

Nie jestem pewien, jak to wpłynie na wyjście, ale to nie może być dobre.

0

Nie musisz się martwić o wstrzyknięcie SQL. Ale powinieneś sprawdzić dane wejściowe, jakie są używane w generowanym html. Wyobraź sobie, że daję komuś ten link: http://www.example.com/viewComic.php?id="/><script type="text/javascript>alert("XSS");</script><img src="22. Ta osoba będzie miała małe okienko wyskakujące z Twojej witryny. A wiele złych rzeczy można zrobić za pomocą javascript. Aby uzyskać więcej informacji, możesz rozpocząć czytanie strony wikipedii o numerze: XSS.

Należy więc sprawdzić, czy liczba, której oczekujesz, jest liczbą. Na przykład z is_numeric.

Powiązane problemy