Witam!
Kilka rzeczy które mi się nasunęły.
-
Airborn ma rację: nie nie można. Dam radę na platformie developerskiej ustaw sobie samo E_ALL. Nie wykluczaj E_NOTICE. Dlaczego?
Jeśli popełnisz gdzieś błąd, to to ci podpowie. W językach takich jak Delphi, C++ i innych zmienne trzeba definiować. W PHP użycie zmiennej jest zarazem definicją jej istnienia zatem jeśli użyjesz ustawienia E_ALL & ~E_NOTICE, to jeśli popełnisz literówkę w nawie zmiennej, to może się okazać, że nawet tego początkowo nie wykryjesz.
Druga sprawa co do ‘’. Czas interpretatora na analizę składni. Jeśli napiszesz $array[index], to analizator musi sprawdzić co to jest index. A jeśli użyjesz apostrofów, to analizator szuka tylko końca tekstu bez analizy jego zawartości. Dlatego przy okazji odradzam używanie w nazwach indeksów “” - cudzysłowów. Tekst zamieszczony w cudzysłowach podlega analizie semantycznej - no i tu tracimy czas procesora.
-
$signin=mysql_query("SELECT id,username,password,lastlogindate FROM users WHERE username='$_POST[username]' AND password='$_POST[passwordmd5]'") or die(mysql_error());
while ($data = mysql_fetch_array($signin)){
if($data[lastlogindate]!='.date("Y-m-d", time()).')
{
}
}
Faktycznie po co pętla!?! Założenie logiczne jest takie że para username i password mogą wystąpić tylko raz. Użycie w tym przypadku while to tylko strata czasu procesora. - while sprawdza warunek - jeśli ok wykonaj zawartośc pętli - po zakończeniu pętli sprawdź warunek … Po co drugi raz sprawdzać warunek jeżeli wiadomo że jeśli jest rekord to tylko jeden. Druga rzecz to pomijam już wzięcie tego date w apostrofy, ale tak jak poprzednik odsyłam do manuala do funkcji date. Przeanalizujmy: date(“Y-m-d”, time()) - znaleziono dwa parametry - 1 Parametr w cudzysłowach - sprawdzić semantycznie (np. “$symbolroku-$symbolmiesiaca-$symboldnia”, gdzie do tych trzech zmiennych przypisze się odpowiednie literki) - analizator musi to sprawdzić składniowo żeby ustalić ostateczny string - i znowu tracimy cenny czas - 1 Parametr pierwszy ustalony - sprawdzenie poprawności formatu - istnieje 2 parametr - sprawdzanie analizy semantycznej … - znowu tracimy czas. - wykonanie funkcji time(). - wykonanie funkcji date A powinno być:
date('Y-m-d')
-
znaleziono jeden parametr - parametr jest zawarty w cudzysłowach - brak sprawdzania analizy semantycznej - sprawdzenie poprawności formatu - brak drugiego parametru - wykonanie funkcji time() - wykonanie funkcji date Czas czas czas - skróciliśmy wykonanie skryptu o dwie złożone analizy semantyczne. Kolejna rzecz:
“SELECT id,username,password,lastlogindate FROM users WHERE username=’$_POST[username]’ AND password=’$_POST[passwordmd5]’”
Pomijam bezpośrednie wsadzenie danych z formularza do query SQL. Wyobraź sobie, że ktoś Ci wpisze jako username string:
';
DELETE FROM users;
SELECT id,username,password,lastlogindate FROM users WHERE username='
Zatem mysql_query ostatecznie wykona zapytanie:
SELECT id,username,password,lastlogindate FROM users WHERE username='';
DELETE FROM users;
SELECT id,username,password,lastlogindate FROM users WHERE username='' AND password='jakieshaslo'
Jak widać (w zależności jakie user łączący się z php do bazy ma prawa) może zrobić małe akuku. Zamiast wmontowania DELETE FROM users może wstawić cokolwiek destrukcyjnego lub lepiej… Może nawet ukraść dane. Hihi. To drugie jest fajniejsze. I gorsze be jeśli system zawiera dane osobowe i odpowiednio nie zabezpieczyłeś systemu…i ktoś je ukradnie i wykorzysta… oj sprawa w sądzie. Kolejna rzecz do tego query. Załóżmy że z $_POST wydobędziesz i sprawdzisz dane i zapiszesz zmienne do np $username i $passwordmd5. To pisząc “… $username … $passwordmd5” powodujesz, że całe zapytanie podlega analizie semantycznej PHP. Owszem kod może jest ładniejszy… ale jeśli mamy długie zapytanie… czas czas… Pisząc ‘SELECT ________’.$username.’_____’.$passwordmd5.’_____’. powodujesz że tekst w apostrofach nie podlega pełnej analizie semantycznej (interpreter nie szuka zmiennych, nie szuka kombinacji typu \n\b\t\s itp.). A nazwy i $username i $password tak czy siak podlegają analizie. Ktoś powie że kropka powoduje dodatkową operacją łączenia tekstu. No ale czy w pierwszym zapisie z cudzysłowami nie dzieje się to samo? Nie upieram się przy tym bo sam z lenistwa tak robię bo mi się kropek nie chce dodatkowych apostrofów i kropek wstawiać. Owszem kod może wydaje się mniej przejrzysty ale czy na pewno? Zapis
"SELECT ..... $username ...$passwordmd5 ...."
zostanie w całości zakolorowany jako tekst (np w Pajączku). Ale zapis:
'SELECT ________'.$username.'_____'.$passwordmd5.' _____'
- nazwy zmiennych będą już widoczne innym kolorem.
Hmmmm… chyba na tyle na ten moment. Jeśli ktoś się nie zgadza to z chęcią posłucham.
Pozdrawiam