Wyimaginowane przesłanie php. Formularze HTML: formularz php - wyślij żądanie na tę samą stronę. Jak uniknąć problemów z PHP _SELF

Długo zastanawiałem się, jaki tytuł nadać temu artykułowi i nie mogłem wymyślić nic lepszego. To jedyny tytuł, który choć w jakiś sposób oddaje istotę tego, co jest powiedziane. Szczerze mówiąc, nie wiem, jak to się poprawnie nazywa, więc nazwałem artykuł w ten sam sposób, w jaki próbowałem znaleźć w wyszukiwarce chociaż część informacji na ten temat.

Na jednej ze stron musiałem użyć dwóch przycisków wysyłania w jednym formularzu, co wysyłałoby wypełnione dane do różnych „programów obsługi” PHP, w zależności od tego, kiedy przycisk został naciśnięty. Google nie odpowiedziało mi na nic rozsądnego, najwyraźniej po prostu niewłaściwie zadałem pytanie, więc musiałem sam to wymyślić.

Podałem to więc pod rozwagę.

Istota problemu

Po samodzielnym wdrożeniu znalazłem jeszcze kilka rozwiązań, które opierały się na zastosowaniu zwykłych przycisków, do których przykręcono JS.

Zaimplementowałem swój plan prawie w ten sam sposób, ale użyłem standardowego typu przesyłania. Wszystko wydaje się działać i moim zdaniem moje rozwiązanie jest bardziej logicznie poprawne.

Rozwiązanie to sprawdzi się równie dobrze zarówno na hostingu darmowym, jak i jeśli wybierzesz hosting profesjonalny. Ta metoda jest implementowana całkowicie po stronie klienta i nie powinna spowalniać serwera.

Aby ułatwić zrozumienie, czego chcę i jak to działa, oto naprawdę działający przykład w postaci formularza, który zawiera 2 zgłoszenia, które wysyłają dane na różne strony.

Jedną z największych zalet PHP jest sposób, w jaki współpracuje z formularzami HTML. Najważniejsze jest to, że każdy element formularza automatycznie staje się dostępny dla Twoich programów PHP. Aby uzyskać szczegółowe informacje na temat korzystania z formularzy w PHP, przeczytaj sekcję. Oto przykładowy formularz HTML:

Przykład nr 1 Najprostszy formularz HTML

Twoje imię:

Twój wiek:

W tej formie nie ma nic specjalnego. Jest to zwykły formularz HTML bez żadnych specjalnych znaczników. Kiedy użytkownik wypełni formularz i kliknie przycisk Wyślij, zostanie wywołana strona action.php. Ten plik może mieć coś takiego:

Przykład #2 Wyświetlanie danych formularza

Cześć, .
Jesteś stary.

Przykładowe wyjście tego programu:

Witaj, Siergiej. Masz 30 lat.

Jeśli nie weźmiesz pod uwagę fragmentów kodu z htmlspecialchars() i (wewnątrz), zasada działania tego kodu powinna być prosta i zrozumiała. Funkcja htmlspecialchars() zapewnia, że ​​„specjalne” znaki HTML są prawidłowo zakodowane, dzięki czemu na stronie nie zostanie wstawiony złośliwy kod HTML lub Javascript. Pole wieku, o którym wiemy, że powinno być liczbą, możemy po prostu zamienić na liczbę całkowitą, co automatycznie pozbędzie się niechcianych znaków. PHP może to również zrobić automatycznie, korzystając z rozszerzenia filtra. Zmienne $_POST["name"] i $_POST["age"] są automatycznie ustawiane przez PHP. Poprzednio używaliśmy superglobalnej zmiennej $_SERVER, ale tutaj używamy również superglobalnej zmiennej $_POST, która zawiera wszystkie dane POST. Zauważ, że metoda wysyłania(metodą) naszego formularza jest POST. Gdybyśmy zastosowali metodę DOSTAWAĆ, wówczas informacje o naszym formularzu będą znajdować się w superglobalnej zmiennej $_GET . Alternatywnie możesz użyć zmiennej $_REQUEST, jeśli źródło danych nie ma znaczenia. Ta zmienna zawiera mieszankę danych GET, POST i COOKIE.

15 lat temu

Zgodnie ze specyfikacją HTTP, powinieneś używać metody POST, gdy używasz formularza do zmiany stanu czegoś po stronie serwera. Na przykład, jeśli strona ma formularz umożliwiający użytkownikom dodawanie własnych komentarzy, taki jak ten tutaj, formularz powinien używać POST. Jeśli klikniesz „Załaduj ponownie” lub „Odśwież” na stronie, do której dotarłeś poprzez POST, prawie zawsze wystąpi błąd — nie powinieneś publikować tego samego komentarza dwa razy -- dlatego te strony nie są zapisywane w zakładkach ani w pamięci podręcznej.

Powinieneś użyć metody GET, gdy formularz pobiera coś z serwera i tak naprawdę niczego nie zmienia. Na przykład formularz wyszukiwarki powinien używać GET, ponieważ przeszukiwanie witryny sieci Web nie powinno zmieniać niczego, na czym może zależało klientowi, a dodawanie zakładek lub buforowanie wyników zapytania wyszukiwarki jest tak samo przydatne jak dodawanie zakładek lub buforowanie statyczna strona HTML.

2 lata temu

Warto wyjaśnić:

POST nie jest bezpieczniejszy niż GET.

Powody wyboru GET vs POST obejmują różne czynniki, takie jak cel żądania (czy „przesyłasz” informacje?), rozmiar żądania (istnieją ograniczenia co do długości adresu URL i wysyłane są parametry GET adres URL) i jak łatwo chcesz udostępniać akcję — na przykład Wyszukiwarki Google to GET, ponieważ ułatwia to kopiowanie i udostępnianie wyszukiwanego hasła komuś innemu, po prostu udostępniając adres URL.

Bezpieczeństwo jest tutaj brane pod uwagę tylko ze względu na fakt, że GET jest łatwiejszy do udostępnienia niż POST. Przykład: nie chcesz, aby hasło było wysyłane metodą GET, ponieważ użytkownik może udostępnić wynikowy adres URL i niechcący ujawnić swoje hasło.

Jednak GET i POST są równie łatwe do przechwycenia przez dobrze umiejscowioną złośliwą osobę, jeśli nie wdrożysz protokołu TLS/SSL w celu ochrony samego połączenia sieciowego.

Wszystkie formularze wysyłane przez HTTP (zwykle port 80) są niepewne, a obecnie (2017 r.) nie ma wielu dobrych powodów, dla których publiczna witryna internetowa nie korzystałaby z protokołu HTTPS (co jest w zasadzie HTTP + Transport Layer Security).

Jako bonus, jeśli korzystasz z TLS, minimalizujesz ryzyko, że Twoi użytkownicy otrzymają do Twojego ruchu kod (AD), który nie został tam umieszczony przez Ciebie.

Metody POST i GET służą głównie do przenoszenia parametrów z sił. Główną różnicą pomiędzy metodami POST i GET jest sposób przesyłania informacji. W metodzie GET parametry przekazywane są poprzez pasek adresu (URL), tj. w nagłówku żądania HTTP, natomiast w metodzie POST parametry przesyłane są poprzez treść żądania HTTP i nie są odzwierciedlane w pasku adresu.

1. Przyciski - Etykieta

Tag tworzy przyciski na stronie internetowej, a jego działanie przypomina wynik uzyskany przy użyciu tagu (z parametrem type="button | reset | Submit"). W przeciwieństwie do tego tagu oferuje zaawansowane opcje tworzenia przycisków. Przykładowo na takim przycisku można umieścić dowolne elementy HTML, w tym także obrazy. Za pomocą stylów możesz zdefiniować wygląd przycisku, zmieniając czcionkę, kolor tła, rozmiar i inne parametry.

Teoretycznie tag powinien znajdować się wewnątrz formularza ustawionego przez element. Przeglądarki nie wyświetlają jednak komunikatu o błędzie i działają poprawnie ze znacznikiem, jeśli zostanie on napotkany samodzielnie. Jeśli jednak chcesz wysłać wynik kliknięcia w przycisk na serwer, należy go umieścić w kontenerze. Znacznik zamykający jest wymagany.

Opcje:

wyłączone - blokuje dostęp i modyfikację elementu.

typ - typ przycisku

wartość - Wartość przycisku, która zostanie wysłana do serwera lub odczytana za pomocą spritsów.

Przycisk z tekstem

Parametr WYŁĄCZONY Blokuje dostęp i modyfikację przycisku. W takim przypadku jest ono wyświetlane w kolorze szarym i użytkownik nie może go aktywować. Ponadto taki przycisk nie może zostać uaktywniony poprzez naciśnięcie klawisza Tab, użycie myszy lub w inny sposób. Jednakże stan tego przycisku można zmienić za pomocą skryptów.

Aktywny przycisk Nieaktywny przycisk

Parametr TYPE Określa typ przycisku, który określa jego zachowanie na formularzu. Poszczególne typy przycisków nie różnią się w żaden sposób wyglądem, ale każdy przycisk ma swoje własne funkcje. Wartość domyślna: przycisk.

Argumenty:

przycisk - Zwykły przycisk.

reset - Przycisk umożliwiający wyczyszczenie wprowadzonych danych formularza i przywrócenie wartości do pierwotnego stanu.

Wyślij - Przycisk wysyłania danych formularza na serwer.

Wyczyść formularz Prześlij formularz

Parametr WARTOŚĆ Określa wartość przycisku, która zostanie wysłana do serwera. Na serwer wysyłana jest para „nazwa=wartość”, gdzie nazwę określa parametr name tagu, a wartość określa parametr value. Znaczenie może pokrywać się z tekstem na przycisku lub być niezależne. Parametr value służy również do uzyskiwania dostępu do danych za pośrednictwem skryptów.

Prześlij formularz

1.1. Przycisk (typ wejścia=przycisk) 1.2. Przycisk z obrazkiem (typ wejścia=obraz) Przycisk ze zdjęciem

Przyciski z obrazami działają podobnie do przycisku Prześlij, ale reprezentują obraz. Aby to zrobić, ustaw type=image i src="image.gif" .

Gdy użytkownik kliknie w dowolnym miejscu obrazu, odpowiedni formularz zostanie przesłany na serwer z dwiema dodatkowymi zmiennymi - sub_x i sub_y . Zawierają współrzędne użytkownika klikającego na obraz. Doświadczeni programiści mogą zauważyć, że nazwy zmiennych wysyłane przez przeglądarkę w rzeczywistości zawierają kropkę, a nie podkreślenie, ale PHP automatycznie konwertuje kropkę na podkreślenie.

1.3. Przycisk przesyłania formularza (typ wejścia=prześlij)

Służy do przesłania formularza do skryptu. Tworząc przycisk służący do wysłania formularza należy określić 2 atrybuty: type="submit" i value="Tekst przycisku" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Nie wymaga skryptu PHP.

1.4. Tablica przycisków (wyślij) umożliwiających wybór opcji akcji 2. Przycisk resetowania formularza (Resetuj)

Po kliknięciu przycisku resetowania wszystkie elementy formularza zostaną ustawione do stanu określonego w atrybutach domyślnych, a formularz nie zostanie przesłany.

Nie wymaga skryptu PHP.

3. Pole wyboru

Pola wyboru dają użytkownikowi szereg opcji i pozwalają na dowolny wybór (żadna, jedna lub więcej).

Biały
Zielony
Niebieski
Czerwony
Czarny

// pierwszy zestaw przycisków
// drugi zestaw przycisków
// trzeci zestaw przycisków

5. Pole tekstowe (tekst)

Podczas tworzenia zwykłego pola tekstowego o rozmiarze size i maksymalnej dozwolonej długości znaków maxlength atrybut type przyjmuje wartość tekst . Jeżeli podano parametr wartość, w polu zostanie wyświetlona wartość określona w zmiennej. Tworząc pole nie zapomnij podać nazwy pola, ponieważ... ten atrybut jest wymagany.

6. Pole Hasło

Dokładnie to samo, co pole tekstowe, z tą różnicą, że znaki wpisane przez użytkownika nie będą wyświetlane na ekranie.

7. Ukryte pole tekstowe (ukryte)

Umożliwia przekazanie do skryptu niektórych informacji serwisowych bez konieczności wyświetlania ich na stronie.

8. Lista rozwijana (wybierz)

Znacznik to lista rozwijana lub rozwinięta, z której można wybrać jeden lub więcej wierszy w tym samym czasie. Ale wartość zostanie przekazana do ostatnio wybranego przycisku.

Lista zaczyna się od sparowanych tagów. Tagi umożliwiają zdefiniowanie zawartości listy, a parametr value określa wartość ciągu znaków. Jeżeli wybrany parametr jest określony w tagu, to początkowo zostanie wybrany wiersz. Parametr size określa, ile wierszy zajmie lista. Jeśli size wynosi 1, lista będzie rozwijana. Jeśli określono atrybut wielokrotny, można wybrać wiele elementów z listy. Ale ten schemat praktycznie nie jest używany, a przy rozmiarze = 1 nie ma to sensu.

Biały Zielony Niebieski Czerwony Czarny

Jeśli chcesz utworzyć listę rozwijaną z przewidywalną sekwencją. Na przykład lista z latami od 2000 do 2050. Następnie stosuje się następującą technikę.

9. Pole wprowadzania tekstu wielowierszowego (obszar tekstowy)

Wielowierszowe pole wprowadzania tekstu umożliwia wysłanie nie tylko jednej linii, ale kilku na raz. W razie potrzeby można określić atrybut readonly, który zabrania edytowania, usuwania i zmiany tekstu, tj. tekst będzie tylko do odczytu. Jeżeli konieczne jest, aby tekst był początkowo wyświetlany w wielowierszowym polu wejściowym, należy go umieścić pomiędzy znacznikami.

Istnieje parametr wrap - ustawiający zawijanie linii. Możliwa wartość:

off - wyłącza zawijanie linii;

virtuals - pokazuje podziały wierszy, ale wysyła tekst w takiej postaci, w jakiej został wprowadzony;

fizyczne – podziały linii pozostają w oryginalnej formie.

Domyślnie tag tworzy puste pole o szerokości 20 znaków i składające się z 2 linii.


Aby wieloliniowe pole tekstowe było zgodne z formatowaniem HTML (zawijanie linii za pomocą znacznika
Lub
), a następnie użyj funkcji nl2br():

Oryginalnie wstawiony wiersz 1 Oryginalnie wstawiony wiersz 2 Oryginalnie wstawiony wiersz 3

10. Przycisk przesyłania plików (przeglądaj)

Służy do realizacji przesyłania plików na serwer. Tworząc pole tekstowe należy także określić typ pola jako „plik”.

Przesyłanie pliku:

SPOSOBY KOMUNIKACJI PRZEGLĄDARKI Z SERWEREM

Istnieje kilka metod udostępnianych przez protokół HTTP. To ważna informacja. Nie ma innych sposobów. W praktyce stosuje się dwa: GET ma miejsce wtedy, gdy dane są przesyłane w pasku adresu, np. gdy użytkownik kliknie link. POST - po kliknięciu przycisku na formularzu.

Metoda POBIERZ

Aby przesłać dane metodą GET nie trzeba tworzyć formularza na stronie HTML (nikt nie zabrania korzystania z formularzy dla żądań metodą GET - ale to głupota) - wystarczy link do dokumentu z dodatkiem ciąg zapytania, który może wyglądać jak pary zmienna=wartość, łączy się za pomocą znaku ampersand &, a ciąg znaków jest dołączany do adresu URL strony za pomocą znaku zapytania „? "

Ale nie musisz używać par klucz=wartość, jeśli chcesz przekazać tylko jedną zmienną; w tym celu musisz wpisać WARTOŚĆ (a nie nazwę) zmiennej po znaku zapytania.

Zaletą przekazywania parametrów w ten sposób jest to, że klienci, którzy nie mogą korzystać z metody POST (na przykład wyszukiwarki), nadal mogą po prostu przekazać parametry do skryptu, klikając łącze i odbierając treść.

Wadą jest to, że po prostu zmieniając parametry w pasku adresu użytkownik może obrócić skrypt w nieprzewidywalny sposób, tworzy to ogromną lukę w zabezpieczeniach w połączeniu z niezdefiniowanymi zmiennymi i włączoną opcją Register_globals lub ktoś mógłby poznać wartość ważnej zmiennej (jak identyfikator sesji), po prostu patrząc na ekran monitora.

Aby uzyskać dostęp do stron publicznych poprzez przekazanie parametrów (zwiększona funkcjonalność)

Przekazywanie informacji niemających wpływu na poziom bezpieczeństwa

Aby uzyskać dostęp do chronionych stron z przekazanymi parametrami

Aby przesyłać informacje mające wpływ na poziom bezpieczeństwa

Do przesyłania informacji, których użytkownik nie może modyfikować (niektóre przesyłają tekst zapytań SQL.

Metoda POST

Dane można przesłać metodą POST wyłącznie za pomocą formularza na stronie HTML. Główna różnica między POST i GET polega na tym, że dane są przesyłane nie w nagłówku żądania, ale w treści, dlatego użytkownik ich nie widzi. Można go modyfikować jedynie poprzez zmianę samego formularza.

Korzyść :

Większe bezpieczeństwo i funkcjonalność w przypadku żądań wykorzystujących formularze POST.

Wada:

Mniejsza dostępność.

Do czego warto go używać:

Aby przesłać dużą ilość informacji (tekst, pliki...);

Aby przekazać wszelkie ważne informacje;

Aby ograniczyć dostęp (np. do nawigacji używaj wyłącznie formularza – opcja niedostępna dla wszystkich programów robotów lub grabberów treści).

Do czego nie należy używać:

Bez ograniczeń.

Przesyłanie plików metodą POST

PHP jest w stanie zaakceptować plik pobrany za pomocą dowolnej przeglądarki. Dzięki temu możliwe jest przesyłanie zarówno plików tekstowych, jak i binarnych. W połączeniu z funkcjami uwierzytelniania PHP i systemem plików, masz pełną kontrolę nad tym, kto może przesyłać pliki i co zrobić z plikiem po jego przesłaniu.

Stronę przesyłania plików można zaimplementować za pomocą specjalnego formularza, który wygląda mniej więcej tak:

//Formularz przesyłania plików Wyślij ten plik:

W powyższym przykładzie „_URL_” należy zastąpić linkiem do skryptu PHP. Ukryte pole MAX_FILE_SIZE (wartość musi być podana w bajtach) musi poprzedzać pole wyboru pliku, a jego wartość określa maksymalny dopuszczalny rozmiar pliku, jaki można zaakceptować. Powinieneś także upewnić się, że w atrybutach formularza podałeś enctype="multipart/form-data", w przeciwnym razie pliki nie zostaną przesłane na serwer.

Uwaga

Opcja MAX_FILE_SIZE jest rekomendacją dla przeglądarki, nawet jeśli PHP również sprawdzi ten warunek. Ominięcie tego ograniczenia po stronie przeglądarki jest dość łatwe, więc nie powinieneś polegać na tej funkcji w celu blokowania wszystkich większych plików. Nie ma jednak sposobu na ominięcie ograniczenia maksymalnego rozmiaru PHP. Tak czy inaczej powinieneś dodać zmienną w postaci MAX_FILE_SIZE, gdyż dzięki temu użytkownicy nie będą czekać niespokojnie podczas przesyłania dużych plików, tylko po to, aby dowiedzieć się, że plik jest za duży i transfer faktycznie się nie powiódł.

Jak zdefiniować metodę żądania?

Bezpośrednio:

Getenv("METODA_WNIOSKU");

zwróci GET lub POST.

Którą metodę należy zastosować?

Jeżeli formularz służy do żądania informacji np. podczas wyszukiwania to należy go przesłać metodą GET. Aby móc zaktualizować stronę, możesz dodać ją do zakładek i/lub wysłać link znajomemu.

Jeżeli w wyniku wysłania formularza dane zostaną zapisane lub zmienione na serwerze, należy je przesłać metodą POST, a po przetworzeniu formularza konieczne jest przekierowanie przeglądarki metodą GET. POST może być również potrzebny, jeśli trzeba przesłać na serwer dużą ilość danych (w przypadku GET jest to bardzo ograniczone), a także jeśli przesyłane dane nie powinny być wyświetlane w pasku adresu (przy wpisywaniu loginu i hasła, Na przykład).

W każdym razie po przetworzeniu POST-u należy zawsze przekierować przeglądarkę na jakąś stronę, nawet tę samą, ale bez danych formularza, aby przy odświeżeniu strony nie zostały one ponownie zapisane.

Jak przenieść dane do innego pliku bezpośrednio z treści programu PHP za pomocą metod GET i POST? Przykład ilustrujący jednoczesne wysyłanie danych metodami POST i GET oraz odbieranie odpowiedzi z serwera.

W tym artykule szczegółowo opisano używanie zmiennej PHP _SELF.

Co to jest zmienna PHP _SELF?

Zmienna PHP _SELF zwraca nazwę i ścieżkę bieżącego pliku (względem katalogu głównego dokumentu). Możesz użyć tej zmiennej w atrybucie akcji formularza. Istnieją również pewne niuanse, które powinieneś znać. Oczywiście nie możemy ignorować tych niuansów.

Spójrzmy na kilka przykładów.

Echo $_SERVER["PHP_SELF"];

1) Załóżmy, że Twój plik php znajduje się pod następującym adresem:

Http://www.yourserver.com/form-action.php

W tym przypadku zmienna PHP _SELF będzie zawierać:

„/form-action.php”

2) Załóżmy, że Twój plik php znajduje się pod tym adresem:

Http://www.yourserver.com/dir1/form-action.php

PHP_SELF będzie:

„/dir1/form-action.php”

PHP _SELF w atrybucie akcji formularza. Dlaczego była tam potrzebna?

Zwykle zmienna PHP _SELF jest używana w atrybucie akcji znacznika formularza. Atrybut akcja określa adres, na który po zatwierdzeniu zostanie wysłana zawartość formularza (użytkownik kliknie przycisk z type="submit"). Z reguły jest to ta sama strona, z której opuścił formularz.

Jeśli jednak zmienisz nazwę pliku, do którego odwołuje się formularz, konieczna będzie zmiana nazwy pliku w atrybucie akcji, w przeciwnym razie formularz nie będzie działał.

Zmienna PHP _SELF uchroni Cię przed niepotrzebnymi poprawkami, gdyż adres strony zostanie wygenerowany automatycznie na podstawie nazwy pliku.

Załóżmy, że masz plik formularza o nazwie form-action.php i chcesz, aby po potwierdzeniu formularz został przesłany do tego samego pliku. Zwykle piszą tak:

Ale możesz użyć zmiennej PHP _SELF zamiast form-action.php. W tym przypadku kod będzie wyglądał następująco: