Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][MySQL][PHP]Bezpiecznie przekazywanie zmiennych między podstronami.
ŁukaszŁ.
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Cześć. Mam pytanie, jak przekazujecie wartości zmiennych między podstronami? Głównie chodzi mi o tak kluczowe dane jak np. login użytkownika, albo numery identyfikacyjne. Pytam dlatego, że pisałem sobie skrypt i zapomniałem się, w formularzy do <input> typu hidden wrzuciłem login użytkownika. Tak więc korzystając z wyświetlenia źródła strony można było sobie wpisać w tego inputa co się chciało... tak więc do bazy dodało mi to co sobie tam wrzuciłem dopisując a nie to co zakładałem. Myślałem o tym, żeby kluczowe parametry przekazywać korzystając ze zmienny $_SESSION. Czy to dobre rozwiązanie?
Mam również pytanie, czy funkcja:

  1. sprawdz_sesje_klienta(){
  2. if(!isset($_SESSION['klient'])){
  3. header("location: wyloguj.php");}
  4. }
  5. }


Jest bezpieczna i tak na każdej podstronie można sprawdzać sesje użytkownika?

Pozdrawiam!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
mikolaj51
post
Post #2





Grupa: Zarejestrowani
Postów: 59
Pomógł: 13
Dołączył: 16.03.2012

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


Przechowywanie w sesji np. id usera to dobre rozwiązanie. Możesz tak sprawdzać czy jest zalogowany - tylko w wyloguj.php musisz tą zmienną sesji usunąć

Ten post edytował mikolaj51 4.09.2012, 21:14:00
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


"Możesz tak sprawdzać czy jest zalogowany, tylko w wyloguj.php musisz tą zmienną sesji usunąć"
Rozumiem, że tam miał być przecinek po zalogowany? smile.gif Bo tak to dwojako można to zdanie rozumieć.

  1. @$stary_user = $_SESSION['prawidlowy_admin']; //tutaj jest login usera
  2. unset($_SESSION['prawidlowy_admin']);
  3. $niszcz = session_destroy();
  4. if (!empty($stary_user)) {
  5. if ($niszcz) {
  6.  
  7. header("location: ../index.php");
  8. }
  9. else {
  10. echo 'Wylogowanie niemożliwe!';
  11. }
  12. }
  13. else {
  14. echo 'Użytkownik niezalogowany więc brak wylogowania';
  15. }


Tak wygląda mój kod wylogowania, czy jest ok? A jak z przekazywaniem zmiennych między podstronami? Tak, żeby było to bezpieczne i żeby user nie mógł ich modyfikować?
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Coż, zależy co te zmienne mają przechowywać? Bo tutaj masz pełen zakres możliwości:
- zmienne sesyjne
- POST i GET
- cookies
- zmienne globalne

Jeśli ta strona funkcjonuje mógłbyś podać link?

Ten post edytował b4rt3kk 5.09.2012, 01:31:02


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Jeszcze stronka nie działa. Chodzi mi o takie wartości, których absolutnie user nie może modyfikować. Jak np. wartość punktową jaką dostanie za np. zgłoszenie się do jakiegoś zadania itp. Myślę, że wtedy z pomocą przychodzą zmienne sesyjne? Tylko przy wylogowaniu usera należy taką zmienną $_SESSION najpierw wyczyścić? Stosując $_SESSION=array(); ?
Go to the top of the page
+Quote Post
peter13135
post
Post #6





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


Przesyłanie danych pomiędzy stronami za pomocą geta i posta nie pasuje do Twojego problemu. Tutaj właśnie potrzebne są zmienne sesyjne, albo ewentualnie singleton + baza danych. Pewnie na jeszcze kilka innych sposobów można Twój problemów rozwiązać... ale wybierz sesje tongue.gif


--------------------
:)
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #7





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Cytat(ŁukaszŁ. @ 5.09.2012, 08:20:18 ) *
Jeszcze stronka nie działa. Chodzi mi o takie wartości, których absolutnie user nie może modyfikować. Jak np. wartość punktową jaką dostanie za np. zgłoszenie się do jakiegoś zadania itp. Myślę, że wtedy z pomocą przychodzą zmienne sesyjne? Tylko przy wylogowaniu usera należy taką zmienną $_SESSION najpierw wyczyścić? Stosując $_SESSION=array(); ?


Cóż, jeśli użytkownik dostaje jakieś punkty to pewno chciałby je z powrotem mieć jak się zaloguje ponownie, więc najlepszym sposobem jest zapis do bazy danych.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #8





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


No dokładnie Panowie, dlatego właśnie potrzebuję przesłać na inną podstronę np. jakąś kluczową wartość dzięki, której będzie można pierdyknąć poprawne zapytanie do bazy
Go to the top of the page
+Quote Post
mikolaj51
post
Post #9





Grupa: Zarejestrowani
Postów: 59
Pomógł: 13
Dołączył: 16.03.2012

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


Przechowujesz w sesji id użytkownika i potem już nie masz problemu z zapytaniem. Tworzysz zapytanie "(...) WHERE id = ..." i będzie dobrze. Nie rozumiem z czym problem:
Cytat
No dokładnie Panowie, dlatego właśnie potrzebuję przesłać na inną podstronę np. jakąś kluczową wartość dzięki, której będzie można pierdyknąć poprawne zapytanie do bazy
ta kluczowa wartość to id użytkownika zapisana w sesji ;-)
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #10





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Wszystkiego niestety nie da się załatwić samym identyfikatorem/ loginem usera biggrin.gif Chociażby tego, że robię skrypt, który wyświetla tylko i wyłącznie nagrody takie na które usera stać czyli nagrody.punkty< user.punkty. W takiej sytuacji najpierw sprawdzam na jakie user się łapie nagrody i obok danej nagrody wyświetlam przycisk do zamówienia, no i właśnie tutaj kluczowa sprawa, muszę przesłać id nagrody, którą zamówił user ale na tyle bezpiecznie, żeby nie mógł on sobie wpisać w podglądzie strony innego id... bo gdyby tak zrobił to mógłby wybrać nagrodę na którą się nie łapie. A zbytnio nie wiem jak wrzucić id nagrody do zmiennej sesji tak, żeby nie robić tego jawnie i żeby nie było widać tego w kodzie.

Jedyne co mi przychodzi do głowy to po prostu na kolejnej podstronie, gdzie już user się zdecydował jaką nagrodę chce po prostu sprawdzić jeszcze raz czy usera stać na taki id nagrody, a jeżeli go nie stać to wyświetlić komunikat o błędzie.

Ten post edytował ŁukaszŁ. 5.09.2012, 15:13:48
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #11





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Więc wszystkie potrzebne zmienne, takie jak id usera, liczbę punktów powinieneś ładować do sesji, żeby były pod ręką w każdej chwili. No i to oczywiste, że należy sprawdzać poprawność przesłanych przez usera danych na każdym kroku. Id nagrody możesz przesyłać nawet w get, byleby sprawdzić:
- czy nagroda o takim id istnieje
- czy pkt użytkownika pozwalają mu taką zamówić
jeśli nie to komunikat o błędzie


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #12





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Wpadłem też na pomysł, żeby kiedy wyświetlam dostępne nagrody dla usera do zmiennej sesji ładować przy okazji id nagrody, a do <a href> jako zmienna get również id nagrody, wtedy na podstronie do ktorej kieruje <a> wystarczyło by sprawdzić:

  1. if($_SESSION[nagrody][$_GET[id_nagrody]] == $_GET[id_nagrody]){
  2. wykonanie skrypt
  3. }
  4. else exit(' Mieszasz coś z nagrodami, nie kombinuj :)');


To ogranicza mi zapytania do bazy i przeklada sie na wydajnosc, co o tym myślicie ?
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #13





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Id nagrody do sesji ładować nie musisz, ale za to możesz sprawdzić $_SERVER['HTTP_REFERER'], jeśli przekierowanie nastąpi z właściwego linka wtedy $_SERVER['HTTP_REFERER'] zwróci adres z której użytkownik tu wszedł, jeśli wpisze samodzielnie w pasku adresu wtedy $_SERVER['HTTP_REFERER'] będzie puste.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #14





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Działa to fajnie, ale to nie jest bezpieczne, faktycznie na stronę nie można wbić z innego linka jak z tego, z którego jest odnośnik ale i tak jak wejdzie się na stronę która przekierowuje usera do innej strony gdzie już wykonuje się zapytanie, to wtedy w stronie źródłowej nadal można ręcznie modyfikować kod html np. w google chrom i dopisywać wartości do linków.

Ten post edytował ŁukaszŁ. 5.09.2012, 17:32:00
Go to the top of the page
+Quote Post
mikolaj51
post
Post #15





Grupa: Zarejestrowani
Postów: 59
Pomógł: 13
Dołączył: 16.03.2012

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


Według mnie nie możesz do końca ufać $_SERVER['HTTP_REFERER'] - o ile się nie mylę, jest ustawiany przez przeglądarkę i można podrobić to curl'em..
Więc do końca nie jest ok

  1. curl_setopt($curl, CURLOPT_REFERER, "http://twoja.strona.pl/?(...)");


Edit: Zerknij tu
http://php.pl/Wortal/Artykuly/PHP/Bibliote...P/Naglowki-HTTP

Ten post edytował mikolaj51 5.09.2012, 18:03:41
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #16





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Tak tak, też to zauważyłem, ale generalnie przesyłanie zmiennych w sesji jest bezpieczne?
Go to the top of the page
+Quote Post
mikolaj51
post
Post #17





Grupa: Zarejestrowani
Postów: 59
Pomógł: 13
Dołączył: 16.03.2012

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


Powinno być bezpieczne, ale zależy jak masz napisany system logowania... Nikt tych zmiennych nie przeczyta sobie ani nie wykorzysta, chyba że przechwyci identyfikator sesji i zamieni sobie w ciasteczku phpsessid smile.gif Taki atak można wykonać, jak skrypt dziurawy - a odpowiadając na pytanie to jest to bezpieczne smile.gif
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #18





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


mój skrypt logowania wygląda tak:

plik loguj.php:
  1. <?php
  2. include_once 'funkcje/funkcje_baza.php';
  3. if(empty($_POST['login']) || empty($_POST['haslo'])){
  4. //header("location:flogowanie.php");
  5. echo '<a href="flogowanie.php">Logowanie</a>';
  6. exit('Nie zostawiaj pustych pól!');
  7. }
  8. $login=$_POST['login'];
  9. $haslo=$_POST['haslo'];
  10. if ($login && $haslo) {
  11. try {
  12. loguj($login, $haslo);
  13. } catch (Exception $e) {
  14. header("location: flogowanie.php");
  15. }
  16.  
  17. }
  18. ?>


a tutaj funkcja loguj() :
  1. function loguj($login, $haslo){
  2. $db = logowanie_do_bazy();
  3. $wynik = $db->query("select * from users where login='".$login."' and haslo=sha1('".$haslo."') and uprawnienia=1");
  4.  
  5. if ($wynik->num_rows>0) {
  6. $_SESSION['prawidlowy_admin']=$login;
  7. header("location: admin99221/main.php");
  8.  
  9. } else {
  10. $wynik_user = $db->query("select * from users where login='".$login."' and haslo=sha1('".$haslo."') and uprawnienia=0");
  11. if ($wynik_user->num_rows>0) {
  12. $_SESSION['prawidlowy_user']=$login;
  13. header("location: user/user.php");
  14. }
  15. else
  16. throw new Exception('Logowanie nie powiodło się!');
  17. }
  18. }


Co o tym myślicie Panowie, da się na tym ujechać? smile.gif Oczywiście zostało mi jeszcze przefiltrowanie danych wprowdzanych przez userów funkcjami, trim,addslashes, i sprawdzanie dlugosci znakow oraz typow ale to zostawię na później , jak cała strona będzie działała poprawnie.
Go to the top of the page
+Quote Post
mikolaj51
post
Post #19





Grupa: Zarejestrowani
Postów: 59
Pomógł: 13
Dołączył: 16.03.2012

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


O addslashes() możesz zapomnieć skoro korzystasz z PDO, a tam jest preparowanie zapytań(bindValue) - określasz sobie typ zmiennej i jest bezpiecznie smile.gif Co do addslashes - nie jest to w 100% bezpieczne

http://php.net/manual/pl/pdostatement.bindvalue.php

Jak reszta strony jest ok, tak żeby nikt nie umieścił złośliwego kodu to nie będzie się dało podszyć pod innego usera...
Nie wiem czy to dobre rozwiązanie ale ja zawsze sobie robię tabele w bazie danych gdzie są utworzone sesje zalogowanych userów smile.gif

Ten post edytował mikolaj51 5.09.2012, 18:33:12
Go to the top of the page
+Quote Post
ŁukaszŁ.
post
Post #20





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 20.08.2012

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


Tak tak, z pdo korzystam tylko skryptu logowania nie przerobiłem jeszcze tak aby korzystał z pdo. Czyli pdo zwalnia mnie ze stosowania addslashes? tego nie wiedziałem smile.gif Właśnie dlatego wszędzie gdzie user może coś zmienić kombinuje tak, żeby miał możliwe jak najmniej możliwości, dlatego też pytałem o przesyłanie zmiennych w sesji. smile.gif
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 Aktualny czas: 20.08.2025 - 21:51