Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo łączenia się z MySQL
Forum PHP.pl > Forum > PHP
WojtasSP320
Witam!

Mam pytanie odnośnie bezpieczeństwa. Piszę aktualnie aplikację w której BARDZO zależy mi na bezpieczeństwie.

Generalnie w panelu admina robię coś takiego:

  1. Sprawdź czy user jest zalogowany
  2. Jeśli tak to połącz z bazą (łączy się skrypt znajdujący się poza drzewem www z uprawnieniami 400) i zapisz połączenie do globalnej zmiennej $con
  3. W przeciwnym wypadku przekieruj, 403, die i w ogóle umrzyj.
  4. Potem dzieje się cały skrypt strony i na końcu (wiem, że nie muszę) robię mysql_close($con)
Moje pytanie brzmi: czy łącząc się w ten sposób (łączenie się na początku, przetrzymywanie połączenia w zmiennej globalnej, trzymanie przez cały skrypt otwartego połączenia) w jakiś wyraźny sposób niesie ze sobą zagrożenie i obniża bezpieczeństwo skryptu niż w wypadku, gdybym co chwila otwierał połączenie, wykonywał zadania na bazie i zamykał za sobąquestionmark.gif

Z góry dzięki za jakiekolwiek info.
darko
Cytat
1. Sprawdź czy user jest zalogowany


Nie mając połączenia z bazą? Możesz rozwinąć koncepcję? Chyba nie robisz:
  1. if($_SESSION["user"] != "") {
  2. // łącz z db
  3. } else {
  4. die("w ogóle umrzyj tongue.gif ");
  5. }


Cytat
przetrzymywanie połączenia w zmiennej globalnej, trzymanie przez cały skrypt otwartego połączenia


Rozumiem, że łączysz sie przez mysql_pconnect

Odnośnie bezpieczeństwa, to polecam korzystanie z PDO, preparowanie składni i bindowanie parametrów przed wykonaniem zapytania (jeśli poprawnie wykonasz, to jesteś odporny na sql injection).


laugh.gif Rozwaliłeś mnie tym
Cytat
die i w ogóle umrzyj.

laugh.gif
Pozdrawiam
WojtasSP320
Na początku każdej podstrony w panelu admina jest coś takiego:

  1. require('../autoryzacja.php');
  2. require('../connect_db.php');


Tak wygląda autoryzacja:

  1. <?php
  2. #Sprawdzam status zalogowania usera
  3. if (!isset($_SESSION['user_status']) || $_SESSION['user_status'] != 'Logged')
  4. {
  5. header('HTTP/1.1 403 Forbidden');
  6. header('Location: ../error/403.html');
  7. die('403 Forbidden');
  8. }
  9.  
  10. #Sprawdzam, czy sesja nie jest "podstawiona"
  11. if (!isset($_SESSION['session_check']))
  12. {
  13. $_SESSION['session_check'] = true;
  14. }
  15.  
  16. #Sprawdzam, czy IP usera to to samo co twórcy sesji
  17. if (!isset($_SESSION['user_ip']) || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
  18. {
  19. $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
  20. }
  21. ?>


Tak wygląda connect_db:
  1. <?php
  2. global $con;
  3. require('config.php'); //Ten plik przypisuje zmiennym $host, $user itd odpowiednie wartości
  4. $con = mysql_connect($host,$user,$password);
  5. if (!$con) {die('Błąd');}
  6. if (!mysql_select_db('sklep')) {die('Błąd');}
  7. mysql_set_charset('utf8',$con);
  8.  
  9. unset($password);
  10. unset($user);
  11. unset($host);
  12. unset($database);
  13. ?>


Dodam tylko, że sesje przechowuję w bazie danych ale to osobna bajka...
darko
Cytat
#Sprawdzam, czy sesja nie jest "podstawiona"
if (!isset($_SESSION['session_check']))
{
session_regenerate_id(true);
$_SESSION['session_check'] = true;
}


To sprawdza jedynie czy zmienna sesyjna session_check ma jakąkolwiek wartość.

Cytat
#Sprawdzam, czy IP usera to to samo co twórcy sesji
if (!isset($_SESSION['user_ip']) || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
session_regenerate_id(true);
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
}


Dodałbym jeszcze sprawdzanie/ustawianie ip dla łączących się przez proxy

$_SERVER['HTTP_CLIENT_IP'];
$_SERVER['HTTP_X_FORWARDED_FOR'];
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.