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

Zabezpieczanie kodu przed wstrykiwaniem sql

0 głosów
1,067 wizyt
pytanie zadane 25 maja 2016 w PHP przez Kacper Duda Obywatel (1,970 p.)

Witam

Mam pytanie, czy poniższy kod może całkowicie unieszkodliwić włamanie przez wstrzykiwanie sql?
Jak są jakieś błędy ortograficzne to proszę nie zwarzać uwagi :)

$text = str_replace("'", "'", $text);
$text = str_replace('"',""", $text);

$bla = $polaczenie->query("SELECT * FROM uzytkownicy WHERE user='$text'");

 

komentarz 25 maja 2016 przez efiku Szeryf (75,160 p.)
Patrz co podesłał Comandeer.

3 odpowiedzi

+5 głosów
odpowiedź 25 maja 2016 przez Comandeer Guru (607,960 p.)
Ten kod przed niczym nie zabezpiecza...

Prepared statements, tyle w temacie: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/60496#60496
0 głosów
odpowiedź 25 maja 2016 przez Paweł Chyła Użytkownik (560 p.)

Podępne się pod pytanie kolegi, żeby nie tworzyć kolejnego tematu na forum. Przeglądałem link podesłany przez Comandeera i tam zmienne są przekazywane w funkcji execute w postaci tablicy. Moje pytanie brzmi czy bindowanie zmienych przez bindParam też jest poprawne, czy tylko używać bindowania w execute ??


 
2
komentarz 25 maja 2016 przez efiku Szeryf (75,160 p.)
W execute każdy parametr domyślnie traktowany jest jako PDO::PARAM_STR.
–4 głosów
odpowiedź 25 maja 2016 przez CzikaCarry Szeryf (75,340 p.)
Lepiej użyj Htmlentities i stałej ENT_QUOTES
komentarz 25 maja 2016 przez Comandeer Guru (607,960 p.)
A jak to niby zabezpiecza przed SQLi?
komentarz 25 maja 2016 przez CzikaCarry Szeryf (75,340 p.)
Zamienia np. myślniki i cudzysłowia na ciągi innych znaków które nie są elementami składni mysql https://www.w3.org/wiki/Common_HTML_entities_used_for_typography
3
komentarz 25 maja 2016 przez Comandeer Guru (607,960 p.)

Ok, to teraz szybki przykład SQLi na Twój sposób.

Baza danych:

CREATE TABLE `test` (
  `test` int(11) NOT NULL,
  `test2` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `test` (`test`, `test2`) VALUES
(1, 0),
(2, 0),
(3, 0),
(4, 0),
(5, 0);

Kod PHP:

<?php
$test = htmlentities( '\\', ENT_QUOTES );
$test2 = htmlentities( ' OR 1=1 #', ENT_QUOTES );

var_dump($esc);
$db = new mysqli('localhost', 'root', '', 'test');
$s = "SELECT * FROM test WHERE test = '" . $test . "' AND test2 = '" . $test2. "'";
var_dump( $s );
$q = $db->query( $s );

while( $r = $q->fetch_assoc() ) {
	var_dump( $r );
}

Wniosek: o kant stołu se można potłuc to całe htmlentities.

Podobne pytania

+1 głos
4 odpowiedzi 1,509 wizyt
pytanie zadane 21 kwietnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
0 odpowiedzi 605 wizyt
pytanie zadane 2 lipca 2018 w PHP przez aleksander_szut Użytkownik (940 p.)
+1 głos
2 odpowiedzi 662 wizyt
pytanie zadane 11 sierpnia 2020 w PHP przez Bakkit Dyskutant (7,600 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,326 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...