Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczeństwo łączenia się z MySQL
WojtasSP320
post
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 13
Dołączył: 13.08.2008
Skąd: Chełmno

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


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

Z góry dzięki za jakiekolwiek info.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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


(IMG:style_emoticons/default/laugh.gif) Rozwaliłeś mnie tym
Cytat
die i w ogóle umrzyj.

(IMG:style_emoticons/default/laugh.gif)
Pozdrawiam
Go to the top of the page
+Quote Post
WojtasSP320
post
Post #3





Grupa: Zarejestrowani
Postów: 87
Pomógł: 13
Dołączył: 13.08.2008
Skąd: Chełmno

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


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

Ten post edytował WojtasSP320 25.11.2009, 13:27:55
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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'];
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: 22.08.2025 - 17:29