![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Hej, jestem początkujący w dziedzinie programowania w PHP ale mimo wszystko trochę już napisałem sam. Jednak mam problem z wyświetlaniem komunikatu odnośnie danych w formularzu. Zrobiłem stronkę do dodawania artykułów, są tam 3 pola i każde musi być wypełnione aby można było wyświetlić wpisane dane. Wywołuje stronkę linkiem 'index.php?sprawdz=0' wyświetla mi formularz. Uzupełniam np dwa pola i zatwierdzam, echo drukuje napis że trzeba uzupełnić puste pole i wywołuje się funkcja 'źle', która generuje stronę z nowym formularzem, lecz znajduje się on pod moim starym, także go nie widać. Jak zrobić to żeby wszystko odbywało się w tym jednym formularzu który jest widoczny?
-------------------- projektowanie stron internetowych
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Bardzo to skomplikowane, a można zrobić prosto w jednym pliku.
Zasada jest taka: 1. Jeżeli wysłano formularz - sprawdzamy pola 2. Jeżeli nie wysłano formularza - pokaż formularz 3. Jeżeli wysłano formularz i są błędy - pokaż błędy i poniżej formularz 4. Jeżeli wysłano formularz i NIE ma błędów - zapisz dane i pokaż podziękowanie Tutaj przykładowy kod:
Oczywiście to tylko przykład, musisz dostosować swój kod do tego schematu. Do zmiennej $error można zapisywać wiele komunikatów o błędach, np gdy trzeba sprawdzić wiele pól lub różne warianty poprawności. Nie wiem gdzie dane mają trafić ale nie zapomnij o bezpieczeństwie - użytkownik może wysyłać z formularza różne śmieci, kod html, lub jakieś inne sztuczki "hackerskie". Tutaj jest przykład działający Ten post edytował Brick 29.10.2009, 19:31:03 -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dokładnie o takie coś mi chodziło
![]() ![]() A tu kod który przerobiłem na własne potrzeby ( może się komuś przyda ):
-------------------- projektowanie stron internetowych
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zamiast $error1, $error2, $error3 itd zrób
Dodanie kropki przed znakiem "=" dopisuje do zmiennej nowe wartości nie kasując wcześniej zapisanych. W ten sposób wszystkie komunikaty o błędach masz w jednej zmiennej. Przy większych formularzach nieraz takich komunikatów jest bardzo dużo, np sprawdzanie poprawności wpisanej daty urodzenia, jakiejś liczby, kodu pocztowego itd. Tworzenie oddzielnych zmiennych dla każdego komunikatu było by bardzo uciążliwe - trzeba by je wszystkie dopisywać do warunków IF, printować w jakiejś pętli itd. BTW - nie musisz robić tak: <input type="text" name="link" value="'.$link.'"> można tak: <input type="text" name="link" value="$link"> Zapisujesz potem te dane do bazy danych czy do pliku? A sprawdź co będzie gdy do treści artykułu ktoś wpisze tekst w którym będzie wiele znaków " (cudzysłów) oraz ' (apostrof) -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Z tymi $errorami zrobiłem tak jak powiedziałeś, faktycznie lepsze rozwiązanie
![]() No i sprawdzałem skrypt na wielu hostingach, darmowych i płatnych i działa mi tylko na jednym. Nawet na 127.0.0.1 nie działa i nie wiem czym to jest spowodowane. -------------------- projektowanie stron internetowych
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Na usunięcie ukośników jest funkcja stripslashes().
Przykład: $tekst_bez_slashow = stripslashes($tekst_ze_slashami) Czym objawia się "nie działanie" skrypt? Klikasz przycisk "zapisz" i nic się nie dzieje? Temat register_globals jest Ci znany? -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
"Nie działanie" objawia się tym że nie wyświetla komunikatu a tym które pola są puste, a po kliknięciu przycisku czyści formularz, bez względu na to czy w którymś polu coś jest czy nie.
Nie wiem co to jest to register_globals ale domyślam się że to jakaś rejstracja zmiennych globalnych. Sprawdzałem przez funkcję phpinfo() i te serwery na których nie działa skrypt mają to wyłączone. Jednak strona będzie stała na serwerze który ma to wyłączone i jak to obejść? Korzystając jednocześnie z php i wyrzucając komunikaty o pustych polach. EDIT:// Trochę poczytałem o tym register_globals i znalazłem taki kod który to obchodzi, dodaje się go na początku każdego pliku. Tym sposobem skrypt działa na każdym serwerze ale czy jest to rozwiązanie bezpieczne? Ten post edytował corey1991 30.10.2009, 16:31:13 -------------------- projektowanie stron internetowych
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
O bezpieczeństwie skryptów PHP to napisano już mnóstwo artykułów i jest nawet temat oddzielny na tym forum. Musisz poczytać więcej żeby nie spotkała cię jakaś niespodzianka, jak ci ktoś zhackuje stronę.
Register_globals jest wyłączone nie bez powodu. Właśnie chodzi o bezpieczeństwo, czyli żeby nikt nie mógł wysłać dowolnych zmiennych. Jeżeli register_globals jest wyłączone, należy korzystać z tablic globalnych $_POST, $_GET, $_COOKIE itd Czyli dane z formularza z pola o nazwie "imię" nie będą widoczna w $imie tylko w $_GET['imie'] Zastosowany kod, który obchodzi taką sytuację, sprawia że sytuacja wygląda jak przy włączonych globals. Czyli każdy może wysłać to co chce, dopisując najzwyczajniej do linka &mojazmienna=1 Moim zdaniem rozwiązanie kwestii bezpieczeństwa za pomocą wyłączenia register_globals to dobra idea ale dopóki można je włączyć to właściwie nic to nie daje koderom. To miał być sposób na różnego rodzaju niedopracowane, amatorskie kody, które miały pełno dziur. Ale sytuacja jest taka, że na jednych hostingach jest OFF a na innych jest ON. Jeżeli pisałbym wszystkie skrypty z założeniem że wszędzie jest OFF, no to może mnie spotkać przykra niespodzianka, gdy mój skrypt trafi na serwer gdzie jest ON. Przykład:
Przy register_globals na OFF wszystko jest ok. Ale gdy skrypt trafi na serwer gdzie globals jest na ON to ktoś złośliwy może napisać w url'u coś takiego: index.php?imie=stefan&wiek=tutaj_jakiś_sql_injection Autor skryptu zakłada że zmienna $wiek może przyjąć wartość 20 lub 25. Gdy globals jest OFF a imię=Stefan to nic się nie wykona. Ale gdy jest ON no to mamy problem. Wniosek z tego jest taki: Zawsze trzeba pisać skrypty zakładając gorszy wariant tj register_globals=On. A skoro tak to cała idea z globals=Off nie ma sensu. Ten post edytował Brick 30.10.2009, 20:07:02 -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ok, poczytałem trochę nt bezpieczeństwa skryptów i wstawiłem do skryptów funkcje takie jak htmlspecialchars i strip_tags. Bezpieczeństwo na pewno jest większe ale czy do końca włamanie się jest niemożliwe?
Czyli danych z formularza nie powinnismy przechowywac z zmiennych, tylko na bieżąco poddawać obróbce? Np.
Tak to powinno wyglądać? -------------------- projektowanie stron internetowych
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie, wstawienie $_GET['imie'] nic nie da. Zrób sobie testowy skrypt i sprawdź co się dzieje. Niekoniecznie musisz wykonywać zapytanie do bazy, możesz je po prostu printować.
Sprawdź jakie wykona się zapytanie do bazy gdy ktoś da taki url: index.php?imie=Stefan'%20or%20imie!='&wiek=1000 Zrób stripslashes dla obydwu zmiennych. -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.05.2025 - 09:18 |