Skocz do zawartości

Prosta strona w php i problemy z kodowaniem


Flanker

Rekomendowane odpowiedzi

Do tego przy komunikacie błędu wypluje zawartość zmiennej

$_GET['id']

, czyli luka XSS gwarantowana.

Jeżeli nie chcecie się bawić w switche to jest inne wygodne i w 100% bezpieczne rozwiązanie:

$dzialy = array('dzial1', 'dzial2', 'dzial3');

if(in_array($_GET['id'], $dzialy))
  include './dane/'.$_GET['id'].'.html';
else
  include 'nieMaTakiejStrony_czy_index.php';

Sprawdź liderów systemów wymiany linków:

linkme.pl (stały), gotlink.pl (rotacyjny)

alexain.jpgalexaol.jpgalexaat.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 32
  • Dodano
  • Ostatniej odpowiedzi

Dziękuję Wam za odpowiedzi i porady, relons zastanawiałem się nad użyciem tablicy jednak zdecydowałem się na coś takiego:

<?php  if($_GET['id']-"1">"0"){echo "<a href='index.php?id="; echo $_GET['id']-'1'; echo"'><< Poprzedni szablon </a>";}
	if($_GET['id']+"1"<="8"){echo "<a href='index.php?id="; echo $_GET['id']+'1'; echo"'> Następny szablon >></a>";} ?>

<?php
	switch($_GET['id'])
	{
		case '1':
			include("1.html");			
			break;
		case '2':
			include("2.html");
			break;
	case '3':
			include("3.html");
			break;
	case '4':
			include("4.html");
			break;
	case '5':
			include("5.html");
			break;
	case '6':
			include("6.html");
			break;
	case '7':
			include("7.html");
			break;
	case '8':
			include("8.html");
			break;
	  default:
			header("Location: ../szablony.php");	
	}
?>

Prosty, zrozumiały dla mnie kod, raczej przy nim zostane ;)

katalog sklepów - darmowy katalog PR4 porady, artykuły, produkty.

Atrakcje turystyczne - wyjade.pl

Odnośnik do komentarza
Udostępnij na innych stronach

Wracając do tematu kodowania utf-8 to wszystkie podstrony muszą być zapisane również jako UTF-8 oraz dodatkowo w pliku głównym index.php zanim zostanie wysłany jeszcze jakiś znak wyślij nagłówek o kodowaniu za pomocą następującego kodu:

<?php
header("Content-Type: text/html; charset=utf-8");
// reszta kodu

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Mion prosze napisz mi dlaczego powinienem dodać ten nagłówek, wszystko działa dobrze bez niego, w metatagach jest deklaracja kodowania charset=utf-8.

katalog sklepów - darmowy katalog PR4 porady, artykuły, produkty.

Atrakcje turystyczne - wyjade.pl

Odnośnik do komentarza
Udostępnij na innych stronach

Spotkałem kiedyś serwer na którym bez tego nagłówka kodowanie UTF-8 nie działało poprawnie mimo deklaracji w head:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Spotkałem kiedyś serwer na którym bez tego nagłówka kodowanie UTF-8 nie działało poprawnie mimo deklaracji w head:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Potwierdzam

U mnie objawiało sie np gdy użyłem sesji lub header('location: ...')

ps

Przyklad Tomahawk jest jednak najbardziej optymalny. Ale taki przyklad nie powinien się znajdować w żadnych tutorialkach dla początkujących. Aby go uzywać trzeba być świadomym jakie zagrożenie ze sobą niesie i nalezy umieć go zabezpieczyć, a tego opisu uświadamiającego właśnie wszędzie brakuje.

.

Odnośnik do komentarza
Udostępnij na innych stronach

Yavaho - to może wyjaśnij jak zabezpieczyłbyś skrypt który includuje COKOLWIEK co mu tam użytkownik w _GET podeśle? Bo moim zdaniem to można użyć albo filtrowania znaków albo intval albo właśnie case/if/in_array i innego sposobu nie ma.

Typowy przykład przeoptymalizowania. Nawet jeśli dziennie wykonasz jeden i drugi skrypt kilkanaście milionów razy to i tak w szybkości działania nie zauważysz żadnej różnicy bo kod tego skryptu to jakieś 1% czasu wykonania. Reszta to apache/php odczyt z dysków i samo include.

Oczywiście można pisać takie skrypty i liczyć na szczęście, nawet wciskać innym kit, że takie coś jest bardziej optymalne bo nie ma jednego odwołania do in_array :) Jak się coś spieprzy to najłatwiej chyba wytłumaczyć to taką kulawą "optymalizacją", szkoda, że pominięcie jednego in_array z optymalizacją nie ma nic wspólnego. Optymalizacja to byłoby umieszczenie wyniku w cache pamięciowym a nie psucie kodu i robienie podstawowych błędów.

Ludzie jakoś włączają do projektow frameworki czy engine szablonów a to ma po kilkadziesiąt K linii i jest tam na pewno więcej niż 150 in_array... i żyją. A potem się zastanawiają , czy może pojedynczy cudzysłów czy podwójny :)

Odnośnik do komentarza
Udostępnij na innych stronach

Yavaho - to może wyjaśnij jak zabezpieczyłbyś skrypt który includuje COKOLWIEK co mu tam użytkownik w _GET podeśle? Bo moim zdaniem to można użyć albo filtrowania znaków albo intval albo właśnie case/if/in_array i innego sposobu nie ma.
Lubisz sie wykłócać na tematy typu ktore święta sa wazniejsze? ;) Czy lubisz krytykowac wszystkie inne metody ktore według Ciebie uznane są za złe. Nie wyjaśniając dlaczego są złe?

Co jeden programista to wymysli sobie swoje własne rozwiązanie. Ważne aby wiedział co robi i jak to bedzie działało, a nie aby skopiował bezmyślnie to co ktoś inny zaproponował. Ja niczego nikomu nie narzucam, każdy ma swój rozum i niech sobie sprawdzi i wybierze co dla niego najlepsze.

W tym przypadku to nawet wystarczy dolepić z przodu katalog (jak podał Tomahawk) i nic obcego nie zostanie zaincludowane.

można użyć: basename()

albo ereg() lub tym podobne

Proste i krótkie i to w zupełności wystarczy. Ale według Ciebie może to być uznane za "kulawą optymalizacje" ?

Sam nawet powyżej wymieniłeś intval i to też w zupełności wystarczy.

A w przypadku zabezpieczenia sie przed SQL injection też uzywasz switchy i dublowania zmiennych aby uniknąć jakichkolwiek metod filtrowania i nie uzywania w zapytaniach zmiennych wziętych z $_GET? Czy w przypadku SQL injection te inne metody są juz dopuszczalne i nie bedą uznane za "kulawą optymalizacje"?

Ja osobiście mam jedną funkcję ktora to sprawdza i wykonywana jest na samym początku bez względu gdzie zmienne z GET potem trafią czy do include czy do mysql_query. Ja akurat zwracam uwagę na to aby nie było coś dwa razy niepotrzebnie sprawdzane / wykonywane.

ps

uzywam pojedynczego cudzysłowia gdzie tylko się da !!!

chciałem nawet poprawic jeden przykład łączenia stringów w tym poscie ale sie powstrzymałem :)

.

Odnośnik do komentarza
Udostępnij na innych stronach

A tam naprawdę to całkowicie Odbiegacie od tematu topicku jakim jest "Prosta strona w php i problemy z kodowaniem", a nie optymalizacja kodu czy też jego bezpieczne programowanie i te całe dywagacje na ten temat są zupełnie zbędne.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Odbiegamy... ale...

@slawek22

Nie zawsze chodzi o optymalizację... Jak chcesz dodać jakąś podstronę to co? Musisz dopisywać też do arraya a takto tylko wrzucasz do katalogu i gites;)

Pozatym wszyscy trąbią, na wszystkich portalach w artykułach o bezpieczeństwie że takie coś jest niebezpieczne.... i wszyscy się na to nabierają... i jak obaczą że ktoś podaje przykład to zaraz walą jakimiś nazwami ataków zamiast zanalizować czy faktycznie takie coś jest niebezpieczne...

Pozatym... poziom bezpieczeństwa zależy od programisty a nie od tego czy robi include zmiennej czy arraya...

Odnośnik do komentarza
Udostępnij na innych stronach

Pozatym wszyscy trąbią, na wszystkich portalach w artykułach o bezpieczeństwie że takie coś jest niebezpieczne.... i wszyscy się na to nabierają... i jak obaczą że ktoś podaje przykład to zaraz walą jakimiś nazwami ataków zamiast zanalizować czy faktycznie takie coś jest niebezpieczne...

I niech trąbią !!

Bo to jest niebezpieczne i amatorskie, tak się po prostu nie powinno robić. Jeszcze ok jeśli robisz to na swoim serwerze dedykowanym gdzie powyłączasz wszystkie niebezpieczne rzeczy( oczywiście jeśli zdajesz sobie sprawę z niebezpieczeństwa takiego rozwiązania ), ale jak robisz to na hostingu w którym nie wiesz do końca jak co jest ustawione( tak jak includowanie plików z serwer zewnętrznego ) to strzelasz sobie gola. Jeszcze uczenie takich rozwiązań, osoby która dopiero co zaczyna zabawę z PHP i zapewne nie zdaje sobie sprawy z niebezpieczeństwa, jest już całkowicie karygodne.

Odnośnik do komentarza
Udostępnij na innych stronach

if($_GET['id'])
$inc=include './dane/'.$_GET['id'].'.html';

W tym przypadku to nawet wystarczy dolepić z przodu katalog (jak podał Tomahawk) i nic obcego nie zostanie zaincludowane.

To sobie zaincludujesz "/../.." i tak masz dostęp do całego drzewa.

i nic obcego nie zostanie zaincludowane. można użyć: basename()

No widzisz, problem jest właśnie w tym , że w przykładowym "najlepszym bo optymalnym" kodziego go nie ma ;) Jasne, że taki kod można a nawet trzeba jakoś naprawić i można to zrobić basename.

Czy lubisz krytykowac wszystkie inne metody ktore według Ciebie uznane są za złe. Nie wyjaśniając dlaczego są złe?

Przecież krytykuję tylko jedną metodę - czyli brak jakiegokolwiek filtrowania danych. Wszystkie inne zaproponowane metody są dobre. To poważne zagrożenie dla bezpieczeństwa a ty piszesz, że to najbardziej optymalne :) Jakiś łosiek tu wejdzie, skopiuje sobie ten najoptymalniejszy kod a potem będzie oglądał pozdrowienia od turkish hackers :P

Przykład: jak jesteś na koncie dzielonym i używasz standardowych skryptów to przez taki include bez filtrowania włamywacz sobie może np. wypisać wszystkie twoje hasła. Powiesz że w .html nie ma haseł. To posyłasz .php%00 i w tym momencie ucina string po php jeśli zgodnie z zaleceniami masz wyłączone magic quotes.

Co jeden programista to wymysli sobie swoje własne rozwiązanie.
uzywam pojedynczego cudzysłowia gdzie tylko się da

Jeśli ci co muszą potem ten kod czytać nie zgłaszają sprzeciwu i lubią sieczkę to nie widzę przeszkód :( ale to jest właśnie taka dyskusja o "wyższości świąt". Nie ważne czy wolne regexy, czy szybkie intval. Ważne, by parametr był wzięty w pojedynczy cudzysłów co i tak nic nie zmienia.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności