directory_listing, skrypt udostępniający zawartość katalogu publicznego

0

Skrypt udostępniający zawartość katalogu publicznego.

Proszę tylko o rzut okiem czy podany kod jest podatny na przeglądanie zawartości całego systemu operacyjnego ;)

Jedynym parametrem przekazywanym do serwera za pomocą $_GET jest identyfikator pliku [numer pozycji w scandir()]

https://github.com/Blackend/php_scripts/blob/main/directory_listing.php

0

Kilka szybkich uwag:

error_reporting( "E_ALL" );

Przekazujesz string, podczas gdy ta funkcja oczekuje argumentu liczbowego. Zapewne chciałeś użyć stałej E_ALL.

	if( isset( $_GET['id'] ) && (int) $_GET['id'] < count( $files ) && is_dir( $_SESSION['path'].$files[ (int) $_GET['id'] ] ) )

	// attach correct directory name to path
	$_SESSION['path'] = realpath( $_SESSION['path'].$files[ (int) $_GET['id'] ] ) ."/";

Dorzuć tutaj klamry i wcięcie, bo musiałem trzy razy się temu przyjrzeć, by upewnić się, że przypisanie jest wykonywane tylko, gdy if przejdzie.

	$icons['file'] = array(
		array( array(

Ostatnią wersją PHP, która nie wspierała notacji [...] i wymagała array(...), było PHP 5.3, wsparcie dla którego skończyło się w sierpniu 2014 roku - więc o ile nie pracujesz z prehistorycznymi serwerami, to nie ma powodu, by używać array(...) zamiast [...] w nowym kodzie.

0

@Sensacyjny Sebastian: Dziękuje bardzo za uwagi :) @Sensacyjny Sebastian from 4programmers, sugestions.

(poprawione)
screenshot-20211126140359.png

Mój błąd, podczas przenoszenia kodu między programami źle mi sformatowało tabulatory przez co oddzieliłem linie znakiem nowej linii (poprawione)
screenshot-20211126135902.png

Nie często piszę w PHP, zatem mam naleciałości z przeszłości ;) (poprawione)
screenshot-20211126140239.png

1

Pierwsza wada, największa - pomieszany widok z logiką. Pół kodu to HTML ze stylami, pół to PHP. Źle!

0

@TomRiddle: Taką ideę przyjąłem - jeden plik, ładujesz tam gdzie chcesz i masz dostęp. Zero konfiguracji, własny motyw nie był w planie.

0
Akasei napisał(a):

@TomRiddle: Taką ideę przyjąłem - jeden plik, ładujesz tam gdzie chcesz i masz dostęp. Zero konfiguracji, własny motyw nie był w planie.

Okej, no to możesz mieć zarówno widok jak i logikę w pliku, ale nie muszą być tak ze sobą wymieszane. Mógłbyś np zrobić że pierwsze 200 linijek to logika, a drugie to widok.

No albo mógłbyś zrobić jak człowiek, i rozwijać aplikacje na wielu plikach, a potem w buildzie je połączyć w jeden.

1

@TomRiddle: Zmieniłem położenie kodu HTML/CSS i PHP.

Czy tak będzie zadowalająco? :)

0
Akasei napisał(a):

@TomRiddle: Zmieniłem położenie kodu HTML/CSS i PHP.

Czy tak będzie zadowalająco? :)

Nadal są połączone. Najpierw masz coś z session, potem html, potem reszta logiki.

0

@TomRiddle: Więcej nie ogarniam. Jedyną możliwość znam pod postacią osobnych plików tzw. szablon.

0
Akasei napisał(a):

@TomRiddle: Więcej nie ogarniam. Jedyną możliwość znam pod postacią osobnych plików tzw. szablon.

Sporządziłem dla Ciebie małe zestawienie.

  • Kolor zielony - widok
  • Kolor niebieski - Twoja logika

Obraezk w załączniku.

A co do samego programu:

  • Twój program całkowicie nie działa dla plików bez rozszerzenia, np LICENSE, bo wywala się dobór ikonki pod niego.
  • Twój program nie ogarnia łączenia ścieżek, wszędzie robisz $_SESSION['path'] . $cos, zamiast użyć np DIRECTORY_SEPARATOR
  • Twój program jest nieodporny na niepoprawne inputy, jak się tak dzieje to renderuje się pół widoku i reszta jest zasypana errorami.
0

@Akasei: Zrobiłem refaktor Twojej aplikacji, żebyś widział jak to się powinno zrobić i jak to powinno wyglądać wynikowo. Tu masz PR'a do Twojego repo, w historii jest lista commitów z refaktorem krok po kroku: https://github.com/Blackend/php_scripts/pull/1/files

Zapytasz pewnie czym się różni wersja zrefaktorowana od niezrefaktorowanej, otóż wyjaśniam:

  • W nowej widok jest całkowicie oddzielony od logiki, tzn nie ma w logice nic co wiedziałoby o HTML'u, stylach, ikonach i innych pierdołach
  • Cały kod jest podzielony na małe funkcje, które przyjmują dane przez parametry, a zwracają dane przez return.
  • Odczyt przez global jest tylko w miejscu, w którym faktycznie trzeba odczytać Twoje globalne zmienne do konfiguracji, $jail, basePath, etc, ale pozostałe dane są przekazywane normalnie przez parametry
  • Jedyne miejsce w którym logika łączy sie z widokiem to main(), czyli "entry point" aplikacji.
  • Renderowanie HTML'a odbywa się w funkcji, a jej wynik jest zwracany, a nie printowany od razu, przez co można ją wywołać, zapisać wynik do zmiennej, i wyrenerować wtedy kiedy się chce (np po session_start() albo przed/po stylach). Daje to więcej kontroli.
0

@TomRiddle: W międzyczasie pisałem własne rozdzielenie na poszczególne pliki, nie jestem specem od PHP - wiem tyle ile mam potrzeb :)
directory_listing.zip

0

@TomRiddle: Powoli analizuję kod, nigdy nie pisałem w ten "sposób", np. to https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc jesrt dla mnie nowość.

0
Akasei napisał(a):

@TomRiddle: Powoli analizuję kod, nigdy nie pisałem w ten "sposób", np. to

A jedziesz po kolei commitami czy czytasz tylko wynikowy kod?

https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc jesrt dla mnie nowość.

To jest po prostu wielolinijkowy string, podobnie jak jak template string w JS.

1 użytkowników online, w tym zalogowanych: 0, gości: 1