Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczeństwo linków
Lethys
post
Post #1





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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ć.

Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
flashdev
post
Post #2





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Po pierwse, to nie powinno sie przekazywać do strlen tablicy, a po wtóre skrypt nie jest zabezpieczony przed sql injection.
Go to the top of the page
+Quote Post
gargamel
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


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.

Go to the top of the page
+Quote Post
Lethys
post
Post #4





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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 ?
Go to the top of the page
+Quote Post
flashdev
post
Post #5





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Cytat(Lethys @ 27.11.2010, 16:41:26 ) *
//to jest źle ale nie mam pojęcia jak zrobić


  1. var_dump($pokaz);

Go to the top of the page
+Quote Post
gargamel
post
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


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 (IMG:style_emoticons/default/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> ......


Ten post edytował gargamel 27.11.2010, 18:00:37
Go to the top of the page
+Quote Post
Lethys
post
Post #7





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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 ?
Go to the top of the page
+Quote Post
flashdev
post
Post #8





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
Lethys
post
Post #9





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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.

Go to the top of the page
+Quote Post
Wicepsik
post
Post #10





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


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

Filtracja nicku -> zapytanie do baszy -> odpowiedni komunikat
Go to the top of the page
+Quote Post
Lethys
post
Post #11





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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 (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
gargamel
post
Post #12





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


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.

Ten post edytował gargamel 27.11.2010, 20:04:12
Go to the top of the page
+Quote Post
Lethys
post
Post #13





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


PDO i prepared statements, nic nie trzeba filtrować.
Go to the top of the page
+Quote Post
Lethys
post
Post #15





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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. }


Ten post edytował Lethys 28.11.2010, 17:02:11
Go to the top of the page
+Quote Post
fr33d0m
post
Post #16





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


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ć (IMG:style_emoticons/default/wstydnis.gif)

Ten post edytował fr33d0m 28.11.2010, 18:40:58
Go to the top of the page
+Quote Post
ADeM
post
Post #17





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


A po co tu dwa zapytania do bazy?
Go to the top of the page
+Quote Post
fr33d0m
post
Post #18





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


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...

Ten post edytował fr33d0m 28.11.2010, 18:57:44
Go to the top of the page
+Quote Post
Wicepsik
post
Post #19





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


  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. }
Go to the top of the page
+Quote Post
Lethys
post
Post #20





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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

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

 



RSS Aktualny czas: 23.08.2025 - 23:01