• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Początki z PDO błędy oraz zapytania

Object Storage Arubacloud
0 głosów
371 wizyt
pytanie zadane 13 lipca 2017 w PHP przez kevin Mądrala (5,010 p.)

Witam!

Mam kilka pytań odnośnie połączeń z bazą danych poprzez PDO:

1. Obsługa błędów

Błędy sprawdzam poprzez try catch, w bloku try umieszczam wszystkie instrukcje do połączenia z bazą. tylko co w sytuacji gdy w tym bloku znajdzie się inna funkcja która rzuca wyjątek ? Dodaję nowy argument w catch i jak chce sprawdzić która funkcja rzuciła wyjątek to jeden z argumentów będzie NULL ?

2. Zabezpieczenie przed SQLInjection

Przed wysłaniem zmiennej do bazy muszę ją zabezpieczyć poprzez htmlentities($from_get, ENT_QUOTES, "UTF-8"); oraz samo zapytanie $sql_query = sprintf("SELECT * FROM USER WHERE zmienna='%s'", mysqli_real_escape_string($db_connect, $from_get)); Tak robiłem nie korzystając z PDO. Używając PDO też muszę tak zabezpieczać zmienne ? Czy każdą zmienna muszę tak zabezpieczać oraz każde zapytanie nawet gdy nie pochodzi ona z GET CZY POST ? Nawet jeżeli skrypt tylko wyświetla dane z bazy ( nie pobiera żadnych danych z POST z GET ) ? Jeżeli mam zmienna zapisaną w cookies i na podstawie tej zmiennej chcę coś wyświetlić z bazy to też muszę tak robić ?

Zabezpieczać zmienne poprzez htmlentities($from_get, ENT_QUOTES, "UTF-8"); muszę zaraz przed zapytaniem ? Jeżeli wykonam tę funkcję na zmiennej:

$zmienna = 4;
$zmienna_druga = "to jest tekst";

$zmienna = htmlentities($zmienna, ENT_QUOTES, "UTF-8");
$zmienna_druga = htmlentities($zmienna_druga, ENT_QUOTES, "UTF-8");


To czy $zmienna jest równa 4 a $zmienna_druga jest równa "to jest jakiś tekst" i mogę to porównać zwykłym if'em ?

 

 

try
{
	$db_connect = new PDO('mysql:host=localhost;dbname=NAME;charset=utf8', 'usr', 'pass', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));  

	$from_get = $_GET['zmienna1'];
	$from_get = htmlentities($from_get, ENT_QUOTES, "UTF-8");

	$sql_query = sprintf("SELECT * FROM USER WHERE zmienna='%s'", mysqli_real_escape_string($db_connect, $from_get));
	$stmt = $db_connect->query($sql_query);  

}
catch(PDOException $e)
{
    $db_connect.close();
	//echo $e;
    
	header("Location: index.php");
	die();
}

 

2 odpowiedzi

0 głosów
odpowiedź 13 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
1. Ale przecież każdy wyjątek możesz rzucić jako inny obiekt. PDO rzuca PDOException. Inna funkcja nie powinna rzucać tego wyjątku, a inny, a więc nie ma problemu z jego łapaniem.

2. Jeśli chodzi o samą bazę danych to nie musisz stosować takich cudów. Wystarczy, że będziesz bindował wartości do zapytania i wtedy osobno wysyłane jest do bazy zapytanie i osobno wartości i nie ma problemu z sql injection. A więc nie używaj żadnych sprintf itp. tylko binduj wartości. htmlentities możesz sobie użyć jeśli dodatkowo potrzebujesz zabezpieczyć dane, które są przesyłane do bazy (np. masz jakiś tekst w którym znaczniki HTML nie powinny działać), lecz przy bindowaniu nie ma szansy, aby mógł on zaszkodzić samej bazie.
komentarz 14 lipca 2017 przez kevin Mądrala (5,010 p.)

2.Dobra ale dane przesłane z każdego input'a mogą mieć kod HTML, SQL  ponieważ użytkownik może go wprowadzić w inpucie. Nie mówię tu np. o loginie, haśle, email bo to przechodzi przed połączeniem z bazą walidację. Input przechowujący opis czegoś tam to już walidacji nie przechodzi więc to powinienem zabezpieczyć htmlentities ?

komentarz 14 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
Powtórzę się: jeśli użyjesz bindowania to wartości przesyłane są do bazy osobno, a zapytanie osobno. Nie ma więc możliwości żadnego ataku, dla samej bazy danych nie musisz tego używać. Chyba że chcesz zabezpieczyć taki na przykład opis przed wstawieniem tam przez kogoś kodu HTML, aby się nie wykonał, wtedy jak najbardziej możesz użyć funkcji tego typu. Jednak dla bezpieczeństwa bazy danych przy użyciu bindowania nie ma potrzeby.
komentarz 14 lipca 2017 przez kevin Mądrala (5,010 p.)

Chodzi Ci o taki przykład: Jest input, ktoś wprowadzi do niego kod html, bazie danych to nie zaszkodzi ale przy odczycie i wyświetleniu tego rekordu echo $rekord; To ten kod html się wykona ?

komentarz 14 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
Dokładnie tak.
0 głosów
odpowiedź 13 lipca 2017 przez Jedras Maniak (54,860 p.)

Nie ma co cudować z takimi zabezpieczeniami, w PDO jak zrobisz coś takiego:

$id = 6;
$stmt = $dbh->prepare('SELECT * FROM customers WHERE customer_id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$result = $stmt->execute();

to wystarczy.

jeżeli skrypt tylko wyświetla dane z bazy

To kto Ci zagrozi tutaj atakiem ? :)

komentarz 20 lipca 2017 przez kevin Mądrala (5,010 p.)
$result = $stmt->execute();

Jest sens sprawdzać czy $result jest true lub false czy ta funkcja rzuci wyjątek ?

 

Jak nazywacie zapytania przed wykonaniem skoro później w pętli operujecie na tablicy z wynikami z zapytania:

while($jak_nazwac_wynik_w_tablicy = $jak_nazwac_zapytanie->fetch(PDO::FETCH_ASSOC))
{
        //...
        //....
       $jak_nazwac_wynik_w_tablicy; // do something
}

Pytam bo sam nie chcę sobie bałaganu narobić.

Podobne pytania

0 głosów
0 odpowiedzi 131 wizyt
pytanie zadane 15 stycznia 2017 w PHP przez Klik Obywatel (1,540 p.)
+1 głos
1 odpowiedź 285 wizyt
pytanie zadane 12 lipca 2016 w PHP przez niezalogowany
+1 głos
1 odpowiedź 982 wizyt
pytanie zadane 28 maja 2016 w PHP przez Mateusz Analityk Stary wyjadacz (13,710 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...