Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie zapytań, klasa
Forum PHP.pl > Forum > PHP
DonJeday
Mam problem ponieważ napisałem klasę wszystko ok, ale nie mam pojecia jak dodać np. addslashes?

Oto klasa:

  1. <?php
  2.  
  3. class SQL
  4. {
  5. public $db_host;
  6. public $db_user;
  7. public $db_name;
  8. public $db_pass;
  9.  
  10.  public function __construct($db_host, $db_user, $db_name, $db_pass)
  11.  {
  12.      $this->db_host = $db_host;
  13.      $this->db_user = $db_user;
  14.      $this->db_name = $db_name;
  15.      $this->db_pass = $db_pass;
  16.  }
  17.  
  18.  public function connect()
  19.  {
  20.      $this->connect = mysql_connect($this->db_host, $this->db_user, $this->db_pass)
  21.      or die ("Nie można połączyć z bazą danych!");
  22.  
  23.      mysql_select_db($this->db_name, $this->connect);
  24.  }
  25.  
  26.  public function query($query)
  27.  {
  28.      $this->query = $query;
  29.      $this->result = mysql_query($this->query);
  30.  }
  31.  
  32.  public function closeSQL()
  33.  {
  34.      mysql_close($this->connect);
  35.  }
  36.  
  37. }
  38. ?>





kombinowałem tak żeby w tej lini:

  1. <?php
  2. $this->query = $query;
  3. ?>


dodać addslashes tak:

  1. <?php
  2. $this->query = addslashes($query);
  3. ?>


ale nie działa...



Jak to rozwiązać, żeby zapytanie automatycznie było zabezpieczone, żebym nie musiał rozkminiać podczas pisania aplikacji o zabezpieczeniu.
bartg
Moja klasa (przypasowana w frameworka):
http://phpfi.com/373319

Jednak nadal można podejrzeć parę rzeczy. Np metody Insert i Update

PS. Nie wiem czy transakcje tam dzialają więc się na nich nie wzoruj

EDIT; Zauważyłem, że jest tam jeszcze assignInt itp., ale to już dawno zostało wyrzucone z kodu ze względu na niewygode pisania zapytań.
empathon
I powiedź mi po co powielasz funkcjonalność już obecną w php? http://pl2.php.net/mysqli
albo jeszcze lepiej: http://pl2.php.net/pdo
DonJeday
Bo się uczę programowania obiektowego, wale te pro funkcje...
Powiedzcie mi jak to zabezpieczyć... a nie zastąpić wbudowanymi funkcjami / klasami...
empathon
Cytat(DonJeday @ 3.11.2008, 18:14:54 ) *
Bo się uczę programowania obiektowego, wale te pro funkcje...
Powiedzcie mi jak to zabezpieczyć... a nie zastąpić wbudowanymi funkcjami / klasami...

Oj tak nie będziemy rozmawiać.
To co narazie robisz ma niewiele wspólnego z OOP ale wątpię żeby ktoś w odpowiedzi na ton żądaniowy udzielił Ci pomocy... powodzenia.
mike
Przenoszę z Programowanie obiektowe na PHP
DonJeday
empathon, z tego co się orientuję to do PDO potrzebny jest sterownik, którego mój serwer nie posiada...
bełdzio
1. dodaj kolejna funkcje ktorej zadaniem bedzie "zabezpieczenie zmiennej"
2. addslashes służy do czego innego, poczytaj o mysql_real_escape_string
DonJeday
Cytat(bełdzio @ 3.11.2008, 21:11:44 ) *
1. dodaj kolejna funkcje ktorej zadaniem bedzie "zabezpieczenie zmiennej"
2. addslashes służy do czego innego, poczytaj o mysql_real_escape_string

1. Właśnie o tym myslałem;


2. mysql_real_escape_string używam do zabezpieczania pól z formularzy czyli danych wchodzących do zapytania, może nie opłaca się zabezpieczyć klasy skoro używam mysql_real_escape_string?
robiłem to tak:
  1. <?php
  2. $login_sec = mysql_real_escape_string($_POST[login], $connect);
  3. ?>

i potem $login_sec wrzucałem do zapytania smile.gif
bełdzio
skoro robisz klase do zabawy z SQL to w niej powinno byc zabezpieczanie, bo jesli teoretycznie zmienisz sterownik z mySQL na np Postrge to bedziesz musial zmienic poza klasa dodatkowo pliki aplikacji smile.gif
pp-layouts
PDO ma swoje minusy (wydaje mi się, że nie ma wszystkich typowych dla MySQL opcji).

Ale może niedobrze uczyć się kododawania MySQL-specific? Heh, w takim układzie, w ogóle czemu PHP, są inne języki, nie będę pokazywał palcem...

Ale używanie MySQL bez MySQLi ? Bezcelowe.

MySQLi ma swoje ograniczenia, i owszem, ale jeśli już coś rozszerzać, to właśnie MySQLi aż się prosi o rozszerzenie. Oczywiście bez sensu dopisywać do niego już istniejącą funkcjonalność, ale są ciekawsze sposoby rozszerzania. Mój lib na przykład implementuje interfejs Countable i Iterator, co pozwala na całkiem przyjemne posługiwanie się zapytaniami w kodzie:

foreach (db::$cc->query('select * from my_table') as $n => $record) { ... }

Ale do takiego skrótu potrzebna jest opcja, w jakiej postaci mają być zwracane rzędy wyniku, u mnie defaultowo zwraca jako obiekty, ale można przełączyć na coś innego.

Co do zabezpieczania, to oczywiście mysqli::real_escape_string(). Podobno prawidłowe działanie tej funkcji wymaga ustawienia locale:

@setlocale('LC_ALL', 'pl_PL.UTF-8');

Jeśli oczywiście używasz UTF-8. Jeśli czegoś innego, ustawiasz na coś innego.

Żeby nie musieć PAMIĘTAĆ o escapowaniu każdego stringa zapodawanego do zapytania, w kodzie inicjującym swoją aplikację zrobiłem escapowanie tablic $_GET, $_POST i $_REQUEST. Tak na wszelki wypadek. Działa. Po włączeniu tego injecty do bazy już mi nie przechodziły smile.gif

O co jeszcze rozszerzam MySQLi? Na przykład poprawiam buga w odczycie wartości pól bitowych. Jeśli sprawdzisz je na true albo false to się zdziwisz. Nie zawierają nawet 0 ani 1. Próba "podglądnięcia" co takiego zwraca php dla takich pól zwróci dziwne rzeczy. A tak na prawdę to chr(0) i chr(1). "Bez sęsu", prawda? smile.gif

Co jeszcze się przydaje? Lepsza obsługa wartości typu set i enum, funkcje kopiowania i przenoszenia tabel, tworzenia widoków, importowania i eksportowania danych... Ale nie będę wklejał kodu, toż to sama przyjemność sobie to napisać smile.gif

A co do tematu zabezpieczania, niech Ci tylko do głowy nie strzeli sprawdzać każdego zapytania przed wysłaniem! TO JEST ZŁE, bo po co sprawdzać coś za każdym wywołaniem funkcji, co może być sprawdzone JEDNORAZOWO, przy uruchomieniu.
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.