Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ograniczenie punktów
kiepski96
post 9.04.2011, 08:01:38
Post #1





Grupa: Zarejestrowani
Postów: 233
Pomógł: 0
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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 .
Go to the top of the page
+Quote Post
Zyx
post 9.04.2011, 08:06:11
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Polecam poczytać, jak wykonujemy zapytania SQL... bo na pewno nie tak, jak napisałeś...


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
kiepski96
post 9.04.2011, 08:12:25
Post #3





Grupa: Zarejestrowani
Postów: 233
Pomógł: 0
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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');
Go to the top of the page
+Quote Post
barcisz
post 9.04.2011, 08:15:47
Post #4





Grupa: Zarejestrowani
Postów: 41
Pomógł: 12
Dołączył: 8.04.2011

Ostrzeżenie: (0%)
-----


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'
Go to the top of the page
+Quote Post
kiepski96
post 9.04.2011, 08:27:40
Post #5





Grupa: Zarejestrowani
Postów: 233
Pomógł: 0
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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 .
Go to the top of the page
+Quote Post
barcisz
post 9.04.2011, 08:34:32
Post #6





Grupa: Zarejestrowani
Postów: 41
Pomógł: 12
Dołączył: 8.04.2011

Ostrzeżenie: (0%)
-----


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ń smile.gif), 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 smile.gif
Go to the top of the page
+Quote Post
kiepski96
post 9.04.2011, 08:42:20
Post #7





Grupa: Zarejestrowani
Postów: 233
Pomógł: 0
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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');
Go to the top of the page
+Quote Post
barcisz
post 9.04.2011, 08:47:22
Post #8





Grupa: Zarejestrowani
Postów: 41
Pomógł: 12
Dołączył: 8.04.2011

Ostrzeżenie: (0%)
-----


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_injection

Opisuje zarówno proste przykłady ataków, jak i sposoby radzenia sobie z nim.
Go to the top of the page
+Quote Post
kiepski96
post 9.04.2011, 08:48:37
Post #9





Grupa: Zarejestrowani
Postów: 233
Pomógł: 0
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


A czy dodanie tylko mojego ip do phpmyadmina (tylko z mojego kompa można się zalogować do niego ) zabezpieczy stronę ?
Go to the top of the page
+Quote Post
barcisz
post 9.04.2011, 08:53:21
Post #10





Grupa: Zarejestrowani
Postów: 41
Pomógł: 12
Dołączył: 8.04.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 03:11