Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo linków
Forum PHP.pl > Forum > PHP
Lethys
Witam, w swoim skrypcie posiadam linki typu:

pokaz.php?gracz=lethys

Po wejściu w taki link będzie pokazywać dane o graczu Lethys.

Chciałbym zabezpieczyć jakoś te linki żeby nie dało się hackować przez wpisywanie czego się chce zamiast nicku gracza.

Kod wyglada mniej więcej tak:

  1.  
  2. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  3.  
  4. // moja próba zabezpieczenia na podawanie za dużo znaków zamiast nicku gracza
  5.  
  6. if (strlen($pokaz) > 10) {
  7. print "Podany nick jest za długi!";
  8. }
  9.  
  10. print "$pokaz[user]<br>życie gracza: $pokaz[hp]";
  11.  
  12.  


Dobrze jest zrobione to moje zabezpieczenie? Chciałbym zrobić warunek że nick gracza może się składać tylko z liter, bez znaków specjalnych ale nie wiem jak to zrobić.

flashdev
Po pierwse, to nie powinno sie przekazywać do strlen tablicy, a po wtóre skrypt nie jest zabezpieczony przed sql injection.
gargamel
W tym przypadku zabezpieczenie przed sql injection: Wyrażenia regularne lub mysql_real_escape_string ale 100% nie daje.

Możesz też skorzystać z hashowania.

Lethys
Zrobię tak żeby nie można było używać niedozwolonych znaków w linkach + rewrite i przyjazne linki.

Problem mam z niedozwolonymi znakami


  1.  
  2. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  3.  
  4. //to jest źle ale nie mam pojęcia jak zrobić
  5.  
  6. if(!ereg('^[-A-Za-z0-9_]', $pokaz)){
  7. print "Użyto niedozwolonych znaków w linku!";
  8. }else{
  9.  
  10.  
  11. print "<h2>$pokaz[user] (ID $pokaz[id])</h2>";
  12. print "<br><br><img border=\"0\" src=\"$pokaz[avatar]\" width=\"80\" height=\"80\">";
  13.  
  14. }


Chcę zrobić aby w linku można było używać tylko alfabetu i cyfr. Jak to przerobić żeby działało ?
flashdev
Cytat(Lethys @ 27.11.2010, 16:41:26 ) *
//to jest źle ale nie mam pojęcia jak zrobić


  1. var_dump($pokaz);

gargamel
Ja jakbym chciał mieć 100% pewności zrobiłbym:
  1. "SELECT * FROM players WHERE md5(user)='".md5($pokaz)."'"


Podłączę się tu trochę do tematu i zapytam innych o zdanie dot. tego sposobu obrony przed SQL injection.

Edit:
Troche od d... strony to robisz winksmiley.jpg

Najpierw robisz zapytanie sql a dopiero potem jakieś instrukcje warunkowe.
Jeśli ktoś Ci pohakierzy poprzez wpisanie czegoś niedobrego do linka to to coś namiesza w tabeli najpierw, a później w zależności czy $pokaz spełnia zadane kryteria bedziesz miał

print "Użyto niedozwolonych znaków w linku!";
lub <h2>$pokaz[user] (ID $pokaz[id])</h2> ......
Lethys
Jak zrobię :

  1. <?php
  2.  
  3. include("config.php");
  4. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  5.  
  6. var_dump($pokaz);
  7. ?>


co wyskakuje:

Cytat
bool(false)
Nie wiem co to ma udowodnic.

Ja chce zrobic tylko tak jak pisalem


  1. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  2.  
  3. //to jest źle ale nie mam pojęcia jak zrobić
  4.  
  5. if(!ereg('^[-A-Za-z0-9_]', $pokaz)){
  6. print "Użyto niedozwolonych znaków w linku!";
  7. }else{
  8.  
  9.  
  10. print "<h2>$pokaz[user] (ID $pokaz[id])</h2>";
  11. print "<br><br><img border=\"0\" src=\"$pokaz[avatar]\" width=\"80\" height=\"80\">";
  12.  
  13. }



Link wyglada mniej wiecej tak: pokaz.php?pokaz=lethys

chce zeby mi odrzucalo pokaz.php?pokaz=&%^&%.- tego typu linki.


Moze ktos mi pomoc z moim kodem ?
flashdev
Cytat(Lethys @ 27.11.2010, 17:57:00 ) *
Nie wiem co to ma udowodnic.


Cytat
Return Values

Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows. The type of returned array depends on how result_type is defined. By using MYSQL_BOTH (default), you'll get an array with both associative and number indices. Using MYSQL_ASSOC, you only get associative indices (as mysql_fetch_assoc() works), using MYSQL_NUM, you only get number indices (as mysql_fetch_row() works).

http://pl2.php.net/mysql_fetch_array
Lethys
Nic mi to nie mówi, nie mam aż takiej wiedzy o php.


Proszę aby jedynie mi ktoś pomógł z tym małym kodem:


  1. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  2.  
  3. //Chcę żeby dostępne były tylko litery alfabetu i cyfry
  4.  
  5. if(!ereg('^[-A-Za-z0-9_]', $pokaz)){
  6. print "Użyto niedozwolonych znaków w linku!";
  7. }else{
  8.  
  9.  
  10. print "<h2>$pokaz[user] (ID $pokaz[id])</h2>";
  11. print "<br><br><img border=\"0\" src=\"$pokaz[avatar]\" width=\"80\" height=\"80\">";
  12.  
  13. }



Link wyglada mniej wiecej tak: pokaz.php?pokaz=lethys

chce zeby mi odrzucalo pokaz.php?pokaz=&%^&%.- tego typu linki.


Dawanie mi linków do wyjaśnień czy też przykładów które nie wiele mają wspólnego z moim problem nic mi nie da bo nie jestem dobry w php.

Zależy mi żeby działał tylko ten prosty kod.

Wicepsik
Tu nie trzeba mieć dużej wiedzy o php tylko trzeba logicznie myśleć.

Filtracja nicku -> zapytanie do baszy -> odpowiedni komunikat
Lethys
No tyle to ja wiem ;D

tylko nie wiem jak przefiltrować ten nick

Rozumiem ze tak jest zle :

  1. if(!ereg('^[-A-Za-z0-9_]', $pokaz)){
  2.  
  3. // moze tak ?
  4.  
  5. if(!ereg('^[-A-Za-z0-9_]', {$pokaz[user]})){
  6.  


Jak bede wiedzial jak przefiltrowac ten nick to reszta jak z platka biggrin.gif
gargamel
Prosz..

zamiast ereg stosuj preg_match, czyli:

  1. preg_match('/^[a-zA-z0-9]{1,10}$/D',$pokaz)


Ale skryptu który przedstawiłeś w żaden sposób to nie zabezpieczy, ogólnie powiedziawszy nie jest on dobry.
Lethys
No niby to jest dobra komenda na sprawdzanie niedozwolonych znakow ale nie działa z moim $pokaz, jak mogę sprawdzić czy to co użytkownik sobie wpisze w linku będzie posiadało niedozwolone znaki czy nie?

Jak robie w ten sposób:

  1. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  2.  
  3.  
  4. if(!preg_match('/^[a-zA-z0-9]{1,10}$/D',$pokaz)){


to preg match nie działa z moim $pokaz, a chce zeby uzytkownik nie mogl wpisac pokaz.php?pokaz=^%$.=_ takiego czegos w linku.
Mephistofeles
PDO i prepared statements, nic nie trzeba filtrować.
Lethys
Ok, zrobiłem to w taki sposób i chyba teoretycznie działa

  1. if(preg_match('/^[a-zA-z0-9]{1,10}$/D', $pokaz['user']))
  2. {
  3. echo '<p>'.$pokaz['user'].'</p>';
  4. }
  5. else
  6. {
  7. echo '<p>Nieprawidłowe dane!!</p>';
  8. }
fr33d0m
Ja bym zrobił to w taki sposób
  1. function filter($zmienna){
  2. $zmienna = strip_tags(trim($zmienna));
  3. $zmienna = mysql_real_escape_string($zmienna);
  4. $zmienna = stripslashes($zmienna);
  5. }
  6. return $zmienna;
  7. }
  8.  
  9. $GetGracz = filter(substr($_GET['gracz'],0,10));
  10.  
  11. $sprawdz = mysql_fetch_array(mysql_query("select COUNT(*) from `players` where `user`='$GetGracz'"));
  12.  
  13. if ($sprawdz[0] == 0){
  14. echo 'Taki player nie istnieje...';
  15. }
  16. else
  17. {
  18. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$GetGracz'"));
  19. echo '<br>'.$pokaz['user'].'<br>życie gracza: '.$pokaz['hp'].'<br>';
  20. }


Nie testowane, ale powinno śmigać wstydnis.gif
ADeM
A po co tu dwa zapytania do bazy?
fr33d0m
Cóż, pisałem kod z głowy i dla pewności działania napisałem dwa zapytania.
Zresztą mój poziom wiedzy jest ograniczony, ponieważ dopiero poznaje PHP więc wybacz...
Wicepsik
  1. if(!preg_match('/^[a-zA-z0-9]{1,10}$/D', $_GET['gracz'])){
  2. echo 'Nieprawidlowa nazwa uzytkownika';
  3. }else{
  4. $s = mysql_fetch_array(mysql_query('SELECT * FROM player WHERE user = "'.$_GET['gracz'].'"'));
  5. if($s){
  6. echo $s['user'];
  7. }else{
  8. echo 'Nie ma takiego uzytkownika';
  9. }
  10. }
Lethys
Rozumiem że taki kod :

  1. <?php
  2.  
  3. include("config.php");
  4. $pokaz = mysql_fetch_array(mysql_query("select * from players where user='$pokaz'"));
  5.  
  6.  
  7.  
  8. if(!preg_match('/^[a-zA-z0-9]{1,10}$/D', $pokaz['user'])){
  9. echo 'Nieprawidlowa nazwa uzytkownika';
  10. }else{
  11. $s = mysql_fetch_array(mysql_query('SELECT * FROM players WHERE user = "'.$pokaz['user'].'"'));
  12. if($s){
  13. echo $s['user'];
  14. }else{
  15. echo 'Nie ma takiego uzytkownika';
  16. }
  17. }
  18. ?>
  19.  


Jest właściwy i będzie w jakiś tam sposób chronił przed sql injection? Jeżeli chodzi o praktyke to działa.
ADeM
Nie będzie ani troche. W 4tej linijce masz nieprzefiltrowaną zmienną $pokaz.
Lethys
Hmm trochę poczytałem o tym ale mimo wszystko przerasta to moje możliwości sad.gif Skończyłem skrypt a na koniec czyli teraz chciałem zająć się bezpieczeństwem ale słabo mi idzie.

A kod z takim filterm $pokaz będzie bezpieczny?

  1. $pokaz = mysql_fetch_array(mysql_query("SELECT * FROM players WHERE md5(user)='".md5($pokaz)."'"));


Dzięki Mephistofeles za informacje ale przerasta to moje możliwości.

Dużo zmian potrzebuje to "moje zabezpieczenie" żeby było bezpieczne przed sql injection?

Jeżeli nie to może znajdzie się jakaś dobra dusza która mi pomoże smile.gif
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.