kiepski96
9.04.2011, 08:01:38
Jeśli w tabeli rejestracja w rekordzie użytkownika wpisze, że ma 400 punktów to chce, aby przy wyborze nagrody jak nie będzie miał tylu punktów wywalało mu błąd.
Tabela : rejestracja Komórka : punkty
Próbowałem tak :
$nick = $_SESSION['username'];
$punkty = "SELECT punkty FROM rejestracja";
$nick = $punkty;
if ($punkty <= 50) die ('Nie masz tylu punktów');
No i w bazie zapisuje , 60 punktów i błąd Nie masz tylu punktów pojawia się cały czas.
Proszę o pomoc .
Polecam poczytać, jak wykonujemy zapytania SQL... bo na pewno nie tak, jak napisałeś...
kiepski96
9.04.2011, 08:12:25
Dzięki za podpowiedź, już wszystko działa,
Dla zainteresowanych zapytanie wygląda tak :
$db=mysql_query("SELECT punkty FROM rejestracja");
$nick = $_SESSION['username'];
$o=mysql_fetch_array($db);
$punkty =$o['punkty'];
$nick = $punkty;
if ($punkty <= 50) die ('Nie masz tylu punktów');
barcisz
9.04.2011, 08:15:47
Przydałoby się jeszcze uzależnić zapytanie od użytkownika, bo w tej chwili obojętnie kto będzie zalogowany to zapytanie zawsze zwróci wszystkie rekordy z bazy, a Ty weźmiesz pod uwagę zawsze tylko pierwszy rekord.
Nie wiem jak wygląda u Ciebie tabela rejestracja, ale to powinno być coś w tym stylu:
SELECT punkty FROM rejestracja WHERE login = 'tutaj_login'
kiepski96
9.04.2011, 08:27:40
Masz rację. Bierze tyko 1-wszy rekord . Zmieniłem to na :
$db=mysql_query("SELECT punkty FROM rejestracja WHERE username = '$nick'");
$nick = $_SESSION['username'];
$o=mysql_fetch_array($db);
$punkty =$o['punkty'];
$nick = $punkty;
if ($punkty <= 50) die ('Nie masz tylu punktów');
Tylko mam problem czy dobrze uzupełniłem to :
Kod
username = '$nick
Bo teraz nawet jeśli ma punkty to wywala, że nie ma .
barcisz
9.04.2011, 08:34:32
Przypisane do zmiennej $nick masz dopiero po wykonaniu zapytania. Powinno być odwrotnie.
Polecam w takich przypadkach po prostu przypisać sobie zapytanie do zmiennej i wypisać ją sobie na ekran, żeby sprawdzić czy na pewno jest takie, jakie chcemy (tylko testowo, docelowo oczywiście nie wypisujemy nigdzie zapytań

), czyli np:
Kod
$sql = "SELECT punkty FROM rejestracja WHERE username = '$nick'";
echo $sql;
$db=mysql_query($sql);
W takim przypadku na pewno zorientujesz się co jest nie tak.
Swoją drogą warto jeszcze doczytać na temat SQL Injection, bo sklejanie zapytania w ten sposób (czyli dodanie po prostu zmiennej $nick, która wcześniej była wprowadzona przez użytkownika, do zapytania) to proszenie się o kłopoty
kiepski96
9.04.2011, 08:42:20
Ok, dziala
A jak zabezpieczyć to przed atakiem ?
Teraz mój kod wygląda :
$nick = $_SESSION['username'];
$db=mysql_query("SELECT punkty FROM rejestracja WHERE username = '$nick'");
$o=mysql_fetch_array($db);
$punkty =$o['punkty'];
$nick = $punkty;
if ($punkty <= 50) die ('Nie masz tylu punktów');
barcisz
9.04.2011, 08:47:22
Sposobów na zabezpieczenie jest kilka, ale warto temat poznać od podstaw (moim zdaniem jak się zrozumie w jaki sposób można wykonać atak SQL Injection, to potem bardziej się na takie sprawy uważa).
Na początek polecam artykuł z wiki:
http://pl.wikipedia.org/wiki/SQL_injectionOpisuje zarówno proste przykłady ataków, jak i sposoby radzenia sobie z nim.
kiepski96
9.04.2011, 08:48:37
A czy dodanie tylko mojego ip do phpmyadmina (tylko z mojego kompa można się zalogować do niego ) zabezpieczy stronę ?
barcisz
9.04.2011, 08:53:21
Zabezpieczy, ale tylko dostęp do samego phpmyadmina. Wiele zależy jeszcze od ustawień samej bazy (można tam ograniczyć, że dostęp jest możliwy tylko z localhosta, wtedy jedynie skrypty na serwerze będą mogły z niej korzystać, a więc phpmyadmin i Twoja strona).
A jeśli chodzi o SQL Injection to w ten sposób się przed nim nie ustrzeżesz, bo hipotetyczny włamywacz tylko lekko modyfikuje Twoje zapytania, a więc dla samej bazy nie ma różnicy między wywołaniem takim, jakie chcesz, a zmodyfikowanym przez intruza.
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.