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

Co wy na taki kod?

Object Storage Arubacloud
+2 głosów
513 wizyt
pytanie zadane 6 lipca 2015 w PHP przez krecik1334 Maniak (58,390 p.)

Zaprezentuję wam jakże obiektowy i cudowny (małpi) kod edycji samochodu znajdującego się w bazie danych. Przeszedł upgrade z kodu w którym przechodziły znaczniki HTML'a i komentarze SQL a także różne inne dziwne rzeczy. Jak to ulepszyć?

$polaczenie->set_charset("utf8");
		 
		$zapytanie = "UPDATE auta SET title=?, marka=?, model=?, rok=?, poj=?, moc=?, przeb=?, paliwo=?, skrzynia=?, kolor=?, cena=?, opis=?, centralny=?, czujdeszcz=?, czujpark=?,
				 elszyb=?, ellust=?, kierwiel=?, klima=?, komp=?, gps=?, ogpost=?, podfot=?, radio=?, sktap=?, tempomat=?, wspomkier=?, abs=?, asr=?, autoalm=?,
				 bdyf=?, bskrz=?, eds=?, immo=?, ktr=?, podpow=?, alu=?, hakhol=?, halogeny=?, xenon=?, przycszyb=?, reldach=?, ksserw=?, klimauto=?, weltap=?,
				 szyber=?, przecmgl=? WHERE id=$_SESSION[idAuta]";
 
		$zapytanie = htmlentities($zapytanie);
		 
		$wyslij = $polaczenie->prepare($zapytanie);
		
		$wyslij->bind_param("sssiiiisssissssssssssssssssssssssssssssssssssss",
							$_POST['title'], $_POST['marka'], $_POST['model'],
							$_POST['rok'], $_POST['poj'], $_POST['moc'], $_POST['przeb'],
							$_POST['paliwo'], $_POST['skrz'], $_POST['kol'], $_POST['cena'], $_POST['opis'],
							$_POST['central'], $_POST['czujd'], $_POST['czujp'], $_POST['elszyb'], $_POST['ellust'], $_POST['kier'],
							$_POST['klima'], $_POST['komp'], $_POST['gps'], $_POST['webasto'], $_POST['pfot'],$_POST['radio'],
							$_POST['skor'], $_POST['temp'], $_POST['wspom'], $_POST['abs'], $_POST['asr'],
						    $_POST['autoal'], $_POST['bdyf'], $_POST['bskrz'], $_POST['eds'], $_POST['immo'], $_POST['kont'],
						    $_POST['podpow'], $_POST['alu'], $_POST['hak'], $_POST['halo'], $_POST['xen'], $_POST['przyszyb'],
							$_POST['relingi'], $_POST['ksserw'], $_POST['klimauto'], $_POST['weltap'], $_POST['szyber'], $_POST['przemgl']); 
		
	    $wyslij->execute();
	    $wyslij->close();

 

2 odpowiedzi

0 głosów
odpowiedź 6 lipca 2015 przez Boshi VIP (100,240 p.)
edycja 6 lipca 2015 przez Boshi
abs=?

To przeszło ? abs() to funkcja wbudowana licząca wartosć bezwzględą więc raczej nie powinno przejsc w twoim zapytaniu.

Strip_tags() usuwa znaczniki html, htmlentities() koduje je. Użył  bym Strip_tags jeżeli chcesz pozbyć się htmla na outpucie;

 

http://stackoverflow.com/questions/16147678/what-is-better-for-user-experience-strip-tags-or-htmlentities-in-php

Ja osobiście korzystam w Yii2 z tego.

http://htmlpurifier.org/

fajna biblioteka, ale  trzeba używaćz rozwagą bo jednak swoje zjada.

 

komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)
Przechodzi. Testowałem, ten abs przechodzi i jest przechowywany z powodzeniem w bazie. Dzięki za przydatną funkcję, zaraz zastosuję :)
komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)
Pytam, bo sam jestem zdziwiony, że słowo kluczowe jest akceptowane przez baze :) Człowiek co chwile się czegoś dowiaduje :)

p.s achhh no tak, przecież wszystko i tak jako string jest traktowane :)
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)
Teraz mam problem, zorientowałem się że kod akceptuje html'a. Dzieje się tak bo htmlentities filtruje tylko znaki zapytania. Co teraz począć, filtrować wszystkie POSTY po kolei co trochę zajmie kodu? bind_param ma gdzieś html, co zrozumiałe, on filtruje tylko SQL'a.
komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)
Ja bym puścił całą tablicę w foreacha i użył strip_tags na każdym elemencie.
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)
Dobry pomysł, ja trochę kaleko operuję na tablicach szczególnie na asocjacyjnych bo ja C++'owiec jestem.
komentarz 6 lipca 2015 przez Schizohatter Nałogowiec (39,600 p.)
Użyj po prostu foreach z $key => $val na $_POST[$key] i tyle.

A ze strip_tags() był uważał i jednak raczej użył htmlspecialchars(), ponieważ strip_tags może usunąć część treści przy błędnym kodzie HTML.
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)

Kod poprawny?

		foreach ($_POST as $k => $v) {
			$_POST[$k] = strip_tags($v);
		}

Przerobiony z php.net :D

komentarz 6 lipca 2015 przez Comandeer Guru (601,110 p.)

Wygląda na poprawny, ale są funkcje od tego ;) np. array_map

komentarz 6 lipca 2015 przez Schizohatter Nałogowiec (39,600 p.)
@Comandeer

Nie wiem, czemu pomyślałem, że funkcje typu map są w Rubim, ale nie ma w PHP :P
komentarz 6 lipca 2015 przez Comandeer Guru (601,110 p.)

[].map vs array_map - pewnie dlatego ;)

0 głosów
odpowiedź 6 lipca 2015 przez Comandeer Guru (601,110 p.)

To, że wykorzystamy obiektowy zapis mysqli wcale nie sprawi, że kod stanie się zgodny z założeniami OOP.

Polecam spojrzeć na PDO, które pozwala w wygodny sposób tworzyć prepared statements i do tego nazywać parametry - ulży Ci to mocno. No i dlaczego dane z sesji nie są zbindowane? Ostrożność nakazuje im również nie wierzyć w 100%. Pomijam już zasadę konsekwencji.

Co do czyszczenia kodu z HTML: https://phpbestpractices.org/#sanitizing-html - można tym przeczyścić całe $_POST przy pomocy array_map lub array_walk_recursive

BTW faktycznie dziwne, że baza się nie rzuca o to abs

komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)
Zdaje się, że taktuje to po prostu jako string i tyle. Choćnie sprawdzałem więc pewny nie jestem.
komentarz 6 lipca 2015 przez Comandeer Guru (601,110 p.)
Jako string traktowałoby, gdyby było otoczone apostrofem/cudzysłowem. Wygląda to tak jakby to nie było słowo kluczowe, hm… a może nazwy funkcji nie są słowami kluczowymi i są rozpoznawane jako funkcje po nawiasach?
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)

Co do "obiektowego" kodu to bardziej miał być taki sarkazm. Nigdy do tej pory nie umiałem programować obiektowo. Ten "abs" to jest słowo kluczowe w takiej postaci jak u mnie w kodzie, podkreśla mi je nawet w edytorze. Ale do bazy przechodzi bez problemu. Co do komentarza na temat obiektowości. To nadal mój 0 projekt i tworząc go na początku nie miałem nawet pojęcia jak mieszać kod PHP z HTML. Nie miałem prawa wiedzieć co to jest PDO. Projekt już jest na wykończeniu i po jego skończeniu od razu biorę się za kursy.

komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)
To jest projekt obiektowy? czy tylko używasz mysqli obiektowo?
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)
To jest projekt proceduralny. Piszę, że małpi kod.
komentarz 6 lipca 2015 przez Comandeer Guru (601,110 p.)

Nie miałem prawa wiedzieć co to jest PDO.

Nic Ci przecież nie zarzucam - napisałem, że PDO powinno Ci ułatwić życie ;) 

komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)

@Comandeer Pytasz czy stwierdzasz?   Myślałem, że interpretuje go jako string bo  całe zapytanie objęte jest w cudzysłów.

komentarz 6 lipca 2015 przez Comandeer Guru (601,110 p.)

@Boshi  a co ma cudzysłów z PHP do zapytania? Ten cudzysłów przecież jest wymagany przez PHP, żeby zapytanie było przez interpreter PHP potraktowane jako string. On nie jest przecież przesyłany do bazy.

A nawet jakby był to baza by to wówczas zinterpretowała jako string, więc wgl zapytanie nie powinno się wykonać.

Sądząc po tym, jak zachowuje się MySQL, to powiedziałbym, że nazwa funkcji traktowana jest jako nazwa funkcji tylko wówczas, gdy po niej następuje operator wywołania.

komentarz 6 lipca 2015 przez Boshi VIP (100,240 p.)
Na to wychodzi, że faktycznie nie interpretuje tego jako funkcje bez ()
komentarz 6 lipca 2015 przez krecik1334 Maniak (58,390 p.)
Sorry za offtop. Jak myślicie to dobry pomysł wrzucenie systemu na roboczy hosting i udostępnienie na forum do "hackowania"? Znalazłoby się wszystkie błędy i luki w zabezpieczeniach, a nawet nie wiem jak zabezpieczyć dobrze hasło (jest tylko 1 użytkownik - admin i hasło jest czytane z pliku .php)

Podobne pytania

0 głosów
3 odpowiedzi 7,171 wizyt
pytanie zadane 24 września 2017 w C i C++ przez s3r31n Początkujący (340 p.)
0 głosów
2 odpowiedzi 723 wizyt
pytanie zadane 12 lutego 2017 w C i C++ przez kikosiak Obywatel (1,010 p.)
0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 7 grudnia 2015 w Nasze projekty przez ErDek19 Użytkownik (870 p.)

92,563 zapytań

141,413 odpowiedzi

319,590 komentarzy

61,948 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!

...