Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z kombinacją zmiennej.
w0jt3k
post
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


Czy taka kombinacja zmiennej jest poprawna i zostanie zinterpretowana przez serwer poprawnie? Głównie chodzi o ochronę przed SQLInjection.

  1. $nazwa_uz = addslashes((string)trim($_POST['nazwa_uz']));


Czy może powinno to wyglądać tak?
  1. $nazwa_uz = addslashes($nazwa_uz);
  2. }
  3. $nazwa_uz = (string)$_POST['nazwa_uz'];
  4. $nazwa_uz = trim($_POST['nazwa_uz']);


Albo jeszcze inaczej wymyśliłem:
  1. $nazwa_uz = addslashes($_POST['nazwa_uz']);
  2. $nazwa_uz = addslashes($nazwa_uz);
  3. $nazwa_uz = (string)$_POST['nazwa_uz'];
  4. $nazwa_uz = (string)$nazwa_uz;
  5. $nazwa_uz = trim($_POST['nazwa_uz']);
  6. $nazwa_uz = trim($nazwa_uz);
  7. }
  8. else
  9. {
  10. $nazwa_uz = (string)$_POST['nazwa_uz'];
  11. $nazwa_uz = trim($_POST['nazwa_uz']);
  12. $nazwa_uz = trim($nazwa_uz);
  13. }


Czy to jest poprawne?

Ten post edytował w0jt3k 30.09.2013, 20:43:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
SmokAnalog
post
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Nie, to nie jest poprawne. addslashes nie uchroni Cię przed SQL Injection. Rzutowanie stringa na string nie ma najmniejszego sensu.

Najlepiej zapoznaj się z wbudowaną biblioteką PDO, która pozwala na eleganckie budowanie bezpiecznych zapytań. Od biedy możesz używać np. mysql_real_escape_string, ale z całego serca polecam PDO.
Go to the top of the page
+Quote Post
w0jt3k
post
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


Ta funkcja wystarczy? + rzutowanie int.

Ten post edytował w0jt3k 3.10.2013, 15:25:39
Go to the top of the page
+Quote Post
em1X
post
Post #4





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Używaj PDO zamiast się takimi przyziemnymi rzeczami przejmować. Samo (int) wystarczy. Nie trzeba dodawać już addslashes.
Go to the top of the page
+Quote Post
w0jt3k
post
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


No, dobrze.Używam już PDO. Ale czy używając tej biblioteki, nie muszę już używać rzutowania typów, addslashe, escape string i tak dalej? Bo PDO zabezpieczy mniez gwarancją?
Go to the top of the page
+Quote Post
em1X
post
Post #6





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Zabezpieczy pod warunkiem, że z niego faktycznie korzystasz:

  1. $stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
Go to the top of the page
+Quote Post
w0jt3k
post
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


Zrezygnowałem z PDO, bo mnie dosłownie wkur... to, ze nie ma zaimplementowanych wielu funkcji z Mysqli.

Czy taki kod jest dobrze zabezpieczony? Niby kolega wyżej mówił, że addslashes nie potrzeba, przy int, no, ale... na wszelki wypadek:

  1. $wynik = $lacz->query("select * from uzytkownicy where email='". $nazwa_uz_l ."' and haslo = '". $haslo_l ."' ");
  2.  
  3. $nazwa_uz_l = $lacz->real_escape_string($nazwa_uz_l);
  4. $nazwa_uz_l = addcslashes($nazwa_uz_l, '%_');
  5. $nazwa_uz_l = addslashes($nazwa_uz_l);
  6. $nazwa_uz_l = (int)$nazwa_uz_l;
  7.  
  8. $haslo_l = $lacz->real_escape_string($haslo_l);
  9. $haslo_l = addcslashes($haslo_l, '%_');
  10. $haslo_l = addslashes($haslo_l);
  11. $haslo_l = (int)$haslo_l;


Nie czepiać się kodowania md5/sha przy haśle (IMG:style_emoticons/default/tongue.gif) To dla testu kod.
(IMG:style_emoticons/default/smile.gif)

I jeszcze jedno pytanie. Jak zabezpieczyć pusty VALUE id_uz
  1. VALUES (''
w:

  1. $wynik = $lacz->query("INSERT INTO uzytkownicy (id_uz, haslo, email, pytanie_pomoc) VALUES ('','".$haslo."', '".$email."', '".$pytanie_pomoc."') ");


Wiersz w bazie w tym miejscu mam unsigned auto increment primary key int wiec wiecie dlaczego puste.

Ten post edytował w0jt3k 16.10.2013, 15:36:31
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Zrezygnowałem z PDO, bo mnie dosłownie wkur... to, ze nie ma zaimplementowanych wielu funkcji z Mysqli.
Sam sobie robisz krzywde, tylko dlatego ze przywykles do dwoch czy trzech funkcji, ktorych odpowiednikow nie potrafisz znalezc....

Cytat
Niby kolega wyżej mówił, że addslashes nie potrzeba, przy int, no, ale... na wszelki wypadek:
A do szkoly/pracy tez chodzisz z pontonem na wszelki wypadek powodzi? (IMG:style_emoticons/default/wink.gif)

Int to int, wystarczy ze zrobisz:
$zm = (int)$zm;

i juz.

Z twojego kodu wynika, ze haslo i email to inty? Ktos z nas czegos tu nie rozumie (IMG:style_emoticons/default/wink.gif)
Z twojego kodu wynika rowniez, ze dane zaczynasz zabezpieczac juz dawno po tym jak wykonales zapytanie, ktore korzysta z tych danych.... Nie sadzisz ze to odrobine za pozno?

Cytat
I jeszcze jedno pytanie. Jak zabezpieczyć pusty VALUE id_uz
A co ty tu chcesz zabezpieczac? Przeciez to ty wkladasz te wartosc. Jak bedziesz sam w kodzie wstawial wartosc 2, to tez bedziesz chcial ja zabezpieczac? Znowu na wszelki wypadek? (IMG:style_emoticons/default/wink.gif)

Poza tym dobrą praktyką jest wstawianie NULL a nie ''

No i czemu po real_escape_string robisz znowu addslashes?? Przeciez podwojnie zaczynasz slashowac wszystko..... Naprawde, im wiecej, nieznaczy lepiej... W tym wypadku znaczy gorzej.
Go to the top of the page
+Quote Post
w0jt3k
post
Post #9





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


No, nie rozumiem. I prosiłbym o szersze wyjaśnienia. Swoją drogą bardzo sięuśmiałem, czytając Twoją opinię (IMG:style_emoticons/default/biggrin.gif) Dzięki za mniej więcej uświadomienie mi błędu.
Mógłby ktoś wyjaśnić mi, jak się więc zabezpieczyć dokładnie? Dam real escape i addcslashes %_ bo real escape nie escapuje %_ i inta przed, tak?

Pozdrawiam, jestem nowy w php.
A i nie mogę znaleźć żadnej książki na temat obrony przed SQL injection, ani po rosyjsku, angielsku, niemeicku, no i polsku... W manualu niby cos tam mam o XSS i inject. o escapach i intach i addcslashach i htmlentitles czy tej drugiej funkcji, no ale i tak nikt tego do kupy nie pozbierał i nie wyjaśnił na konkretnych przykładach.
Go to the top of the page
+Quote Post
em1X
post
Post #10





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Nie trzeba zakładać 50 kondomów, jeden wystarczy.
  1. $id=(int)$_GET['id'];

zostanie zawsze na liczbę zamieniony, co by w tym nie było. Jaśniej chyba nie można? Nie trzeba (do liczb) więcej "zabezpieczeń" jak to nazwałeś.
Do zmiennych zawierających tekst użyj tylko htmlspecialchars, więcej też Ci nie potrzeba.

Powinieneś PDO używać, nie potrafisz i twierdzisz, że Cię denerwuje. Jakich funkcji Ci brakuje?
Go to the top of the page
+Quote Post
w0jt3k
post
Post #11





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 29.09.2013

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


Np. num_rows.
Go to the top of the page
+Quote Post
em1X
post
Post #12





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


http://php.net/manual/en/pdostatement.rowcount.php
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
No, nie rozumiem. I prosiłbym o szersze wyjaśnienia. Swoją drogą bardzo sięuśmiałem, czytając Twoją opinię Dzięki za mniej więcej uświadomienie mi błędu.
Mógłby ktoś wyjaśnić mi, jak się więc zabezpieczyć dokładnie? Dam real escape i addcslashes %_ bo real escape nie escapuje %_ i inta przed, tak?

To moze napisz dokladnie czego nie zrozumiales z mojego posta, bo nie wierze ze nic. A jesli naprawde nie zrozumiales nic, to poprostu sie w ogole nie starales by zrozumiec....

Przeciez napisalem wyraznie ja, oraz wczesniej przedemna inni, ze liczb nie trzeba escapowac tylko rzutowac na int i juz. TU nie ma co wyjasniac ani robic nic wiecej "na wszelki wypadek". Liczba to liczba, ona nie ma nic do escapowania po zrzutowaniu na INT.

Napisalem ci rowniez, ze zabezpieczasz dane po tym, jak juz z nich skorzystales..... To tak jakbys slodzil herbate juz po tym, jak ją wypiles... Durne, nieprawdaz? Jak chesz miec slodką herbate to ją sie slodzi przed wypiciem a nie po. Identycznie z danymi do zapytania: je sie zabezpiecza przed wykonaniem zapytania a nie po. Naprawde tego nie rozumiesz i to też wymaga dodatkowych wyjasnien?

Escapowanie %_? Po co? Dodatkowo oprocz addcslashes robisz addslashes..... Toz ci napisalem, ze robisz to podwojnie, a przez to zle. Ma byc samo real_escape_string. Tu rowniez nie ma co tlumaczyc.


num_rows? Uzywam PDO od x lat i pewnie jestem dziwny, ale ani razu nie potrzebowalem num_rows, bo i po co? By sprawdzic czy uzytkownik z danym emailem i haslem istnieje? W tym celu poprostu pobieram rekord przy pomocy FETCH. Jak sie rekord pobierze, znaczy ze user istnieje, jak sie nie pobierze znaczy ze nie istnieje (pomijam przypadek bledu zapytnia by nie mieszac.)
Go to the top of the page
+Quote Post

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.12.2025 - 23:26