Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]Bezpiecznie przekazywanie zmiennych między podstronami.
Forum PHP.pl > Forum > Przedszkole
ŁukaszŁ.
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!
mikolaj51
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ąć
ŁukaszŁ.
"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ć?
b4rt3kk
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?
ŁukaszŁ.
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(); ?
peter13135
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
b4rt3kk
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.
ŁukaszŁ.
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
mikolaj51
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 ;-)
ŁukaszŁ.
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.
b4rt3kk
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
ŁukaszŁ.
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 ?
b4rt3kk
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.
ŁukaszŁ.
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.
mikolaj51
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
ŁukaszŁ.
Tak tak, też to zauważyłem, ale generalnie przesyłanie zmiennych w sesji jest bezpieczne?
mikolaj51
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
ŁukaszŁ.
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.
mikolaj51
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
ŁukaszŁ.
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
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.