Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Optymalizacja i bezpieczeństwo zapytań
Forum PHP.pl > Forum > Przedszkole
vegeta
Można jakoś zoptymalizować te zapytania? Byłbym wdzięczny za podanie błędów, które mogą zaszkodzić bezpieczeństwu bazy.

  1. $zarejestrowani = "SELECT COUNT(id) FROM `users`";
  2. $zarej = mysql_fetch_array(mysql_query($zarejestrowani));
  3. $online = "SELECT COUNT(active) FROM `users` WHERE active='1' and last_action > ".(time() - 900)."";
  4. $active = mysql_fetch_array(mysql_query($online));
  5. $ostatni = "SELECT `login` FROM `users` ORDER BY `id` DESC LIMIT 1";
  6. $ost = mysql_fetch_array(mysql_query($ostatni));
  7. $mostactive = "SELECT `mostactive` FROM `inne` WHERE `id`='1'";
  8. $mostact = mysql_fetch_array(mysql_query($mostactive));


Wyniki wyświetlam później np.
Kod
Online: '.$active['COUNT(active)'].'<br />
Fifi209
Przecież nie wstawiasz tutaj żadnych zmiennych do zapytania.

Po co ten temat? To tak jakbyś zapytał jaka jest szansa, że szary kowalski wyniesie Twój sejf z 15cm tytanowymi ściankami i go rozwali. ;p
Mephistofeles
Nie, tylko jedna mała uwaga: intów nie dawaj w żadne apostrofy/cudzysłowy, nie trzeba. I używaj apostrofów zamiast cudzysłowów w PHP gdy nie korzystasz z wstawiania zmiennych bezpośrednio w treści tekstu.
mmica
Przefiltruj, escapuj etc., a najlepiej przejdź na OOP i skorzystaj z PDO i preparowania zapytań. Z PDO masz mniej rzeczy na głowie i możesz spać spokojnie wiedząc, że wszystko jest w porządku i niczego nie zapomniałeś przefiltrować pod kątem niepożądanego kodu. Ale nie masz co się martwić jeżeli nie wstawiasz zmiennych do zapytania winksmiley.jpg

@Mephistofeles: Widzę, że są dwie różne szkoły. Jedni radzą zawsze używać apostrofów, a inni wręcz przeciwnie. Czy brak apostrofów nie ułatwia czasami sql injection? Możliwe, że coś pomieszałem, a jeżeli tak się stało niech mnie ktoś oświeci. W samym SQL nie używać, bo nie ma po co, ale obsługa bazy przez PHP to już inna baja, nie? (biorę pod uwagę, że w tym kodzie ma to małe znaczenie [statyczne zapytania], ale przeczyta to ktoś dopiero zaczynający zabawę z PHP i będzie buble pisał, a nie kod..)

Pozdrawiam,
mmica
vegeta
Ok. A da się jakoś połączyć te zapytania, aby było ich mniej?
Fifi209
Cytat(mmica @ 2.12.2010, 16:06:00 ) *
Przefiltruj, escapuj etc.,

Popatrz na kod i odpowiedz mi na pytanie: Co przefiltrować? Co escapować?
Cytat(mmica @ 2.12.2010, 16:06:00 ) *
a najlepiej przejdź na OOP i skorzystaj z PDO i preparowania zapytań. Z PDO masz mniej rzeczy na głowie i możesz spać spokojnie wiedząc, że wszystko jest w porządku i niczego nie zapomniałeś przefiltrować pod kątem niepożądanego kodu.

A jak masz wykopać jedną małą dziurę to kupisz koparkę?
Cytat(mmica @ 2.12.2010, 16:06:00 ) *
Ale nie masz co się martwić jeżeli nie wstawiasz zmiennych do zapytania winksmiley.jpg

Więc po co piszesz o filtrowaniu i escapowaniu?

Cytat(mmica @ 2.12.2010, 16:06:00 ) *
Widzę, że są dwie różne szkoły. Jedni radzą zawsze używać apostrofów, a inni wręcz przeciwnie.

Wystarczy popatrzeć na wydajność.
Link!
Cytat(mmica @ 2.12.2010, 16:06:00 ) *
Czy brak apostrofów nie ułatwia czasami sql injection?

Jaką różnicę zrobi wpisanie np. jako username
' and 1=1 /*
" and 1=1 /*

Dla mnie żadną
mmica
@fifi209: No nie trzeba od razu tak besztać. Po to istnieje to forum, aby rozmawiać i wyprowadzać z błędu. Kolega napisał:
Cytat
Byłbym wdzięczny za podanie błędów, które mogą zaszkodzić bezpieczeństwu bazy.
A ja odpowiedziałem co może mu się przytrafić i na co powinien uważać, tylko tyle.

A co do apostrofów: wyraziłem moją niepewność.

Cytat
Jaką różnicę zrobi wpisanie np. jako username
' and 1=1 /*
" and 1=1 /*

Dla mnie żadną

Tak, chyba trochę robi różnicę. Stringa trzeba zamknąć, a jeżeli wyescape'uje się ciąg podany jako argument zostaną wyescapowane wszystkie apostrofy, a zatem ciąg nie zostanie zamknięty i żaden OR ani nic podobnego nie zdziała, bo zostanie częścią stringa, prawda? Poza tym mowa była o int'ach i w tym przypadku bez podania apostrofów escapowanie nie pomogłoby. Chyba, że ja tutaj czegoś nie pojmuję.

Argument, który przemawia za PDO, to przenośność pomiędzy bazami danych. Możliwe, że w przyszłości będziemy musieli uruchomić ten skrypt na innym serwerze, na którym nie będzie MySQL tylko PostgreSQL i co wtedy? Będziemy przepisywać cały kod? Moim zdaniem lepiej pomyśleć o tym wcześniej niż później kląć pod nosem i rezerwować sobie godziny nerwów. Nie rozumiem też tego porównania do koparki. Za pomocą PDO wszystko miałoby zwięzłą i zrozumiałą formę. Mogłbym zrozumieć gdyby chodziło o jakąś zewnętrzną bibliotekę, którą trzeba dołączyć, ale PDO to standard..

Dzięki za ciekawy link! Muszę go później dokładniej przejrzeć.

Pozdrawiam,
mmica
Fifi209
Przenośność swoją drogą ale pamiętaj nie wszystko będzie działało tak "hop siup" smile.gif To zupełnie inne bazy, inne silniki, niby standard SQL ale jest troszkę inaczej.
Mephistofeles
Chcąc zapewnić pełną przenośność lepiej użyć Doctrine (Propela).
vegeta
Dobra, ale jak je zoptymalizować (zrobić z tych zapytań jak najmniejszą liczbę przy tym samym wyniku)?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.