logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[PHP] skrypt komentarzy - blokowanie pustych wiadmości

Mody 22 Gru 2007 16:27 1645 13
REKLAMA
  • #1 4613920
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    Posiadam skrypt komentarzy wszystko jest w nim dobrze oprócz jednego małego problemu. Skrypt pozwala na dodanie komentarza bez treści i nazwy użytkownika. Jak zapobiec wysyłaniu komentarzy bez treści? Nie jestem dobry w php, szukałem w różnych kursach i innych skryptach niestety nie znalazłem odpowiedzi. Skrypt jest podzielony na dwa pliki główny "kom.php" i dodający komentarz do pliku "add.php".

    Pozdrawiam

    add.php
    <?
    extract($_REQUEST);
    $napis="Dziękujemy za komentarz, Kliknij aby powrócić do strony głównej.";
    $dataloc="data.txt";
    
    $zobacz="<center><a href=index.php>$napis</a></center>";
    $data=date("d.m.Y, G:i");
    $read=fopen($dataloc, "r");
    $fileread = fread($read, filesize($dataloc));
    fclose($read);
    
    
    fwrite (fopen("data.txt", "r+"), "<table border=0 cellpadding=0 cellspacing=0 width=100% bgcolor=#e0e0e0><td width=100%><a href=mailto:$mail class=mail>$imiez $imie</a> - Wysłany: $data<br> $komentz $koment <BR><hr noshade size=1 color=#000000> \n $fileread</td>
    </table>");
    
    fclose(fopen("data.txt", "a+"));
    
    echo ("$zobacz");
    ?>


    kom.php
    <html>
    <body>
    <center>
    <?
    //otwieranie komentarzy
    
    $sciezka = "data.txt";
    $plik = fopen($sciezka, "r");
    $zawartosc = fread($plik, filesize("data.txt"));   
    
    echo $zawartosc
    ?>
    
    <div align="center">
    <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#cce6ff">
    <tr><td width="100%"><hr noshade size=1 color=#000080 width="100%"></td></tr>
    </table>
    </div>
    
    <form method="post" action="add.php">
    <p>imię/nick: <input type="text" name="imie" size=20> mail: <input type="text" name="mail" size=20><br>
    komentarz:<textarea rows="8" name="koment" cols="34"></textarea></p>
    <input type="submit" value="Dodaj">
    <input type="reset" value="Wyczysc">
    </form>
    
    </center>
    </body>
    </html>
  • REKLAMA
  • #2 4613973
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Witam, nieładny ten kod jest. Nie sprawdzałem, ale wygląda na to, że za nazwę użytkownika odpowiada zmienna $imie a za treść komentarza $koment. Więc trzeba sprawdzać czy nie są one puste.

    Dodatkowo mam dziwne przeczucie że używanie
    extract($_REQUEST);
    może mieć bardzo przykre konsekwencje. Warto też filtrować conieco to co wklejają ludzie w komentarzach. Zamiast cudzysłowów używać apostrofów (Wydajność!) i zrezygnować z niepotrzebnych tabel w HTML.

    Pozdrawiam, Krzysztof.
  • REKLAMA
  • Pomocny post
    #3 4614253
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    krzychoocpp napisał:
    Nie sprawdzałem, ale wygląda na to, że za nazwę użytkownika odpowiada zmienna $imie a za treść komentarza $koment. Więc trzeba sprawdzać czy nie są one puste.


    Ok. Ale przynajmniej napisz koledze jak to sprawdzić.

    najprosztszy sposób na to jest następujący:

    
    if ($komentz != '') {
    fwrite (fopen("data.txt", "r+"), "<table border=0 cellpadding=0 cellspacing=0 width=100% bgcolor=#e0e0e0><td width=100%><a href=mailto:$mail class=mail>$imiez $imie</a> - Wysłany: $data<br> $komentz $koment <BR><hr noshade size=1 color=#000000> \n $fileread</td>
    </table>");
    fclose(fopen("data.txt", "a+")); 
    }
    


    Dodatkowo, jak napisał krzychoocpp stosowanie linijki 'extract[...]', które jest przystosowaniem starego skryptu (pisanego pod php z właczonym) registered globals do najnowszych wersji, może mieć złe skutki. Poczytaj w kursach o tablicach $_GET i $_POST oraz filtrowaniu zawartości przychodzącej. Ze swojej strony polecam kurs php znajdujący się na stronie webhosting.pl

    Pozdrawiam.
  • #4 4614991
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    Wstawiłem przerobiony kod kolegi ostry_18 i coś nie
    dział jak ma, bo komentarze nie są w ogóle
    zapisywane. Chyba jednak sobie nie poradzę z
    pozbyciem extract($_REQUEST) ledwo co udało mi się
    dodać datę do zapisywanych komentarzy.

    Pozdrawiam
  • Pomocny post
    #5 4615203
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Spróbuj tak:
    if ($koment != '') { 
    fwrite (fopen("data.txt", "r+"), "<table border=0 cellpadding=0 cellspacing=0 width=100% bgcolor=#e0e0e0><td width=100%><a href=mailto:$mail class=mail>$imiez $imie</a> - Wysłany: $data<br> $komentz $koment <BR><hr noshade size=1 color=#000000> \n $fileread</td> 
    </table>"); 
    fclose(fopen("data.txt", "a+")); 
    }


    Różnica jest w zmiennej w warunku na początku...

    Pozdrawiam, Krzysztof.
  • REKLAMA
  • #6 4616401
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    Wszystko już dobrze działa. W jakim celu są potrzebne zmienne $imiez i $komentz, nie są nawet zdeklarowane. Po dodaniu komentarza wyświetla się strona z podziękowaniem i linkiem który trzeba kliknąć aby powrócić do strony głównej. Jak zrobić aby np. o okresie 2 sekund automatycznie powrócił do strony głównej. Próbowałem też wstawić w pętle if funkcję echo aby wyświetlała się informacja o braku wypełnionych pól lecz pojawia się ona gdy wszystkie pola się wypełnione. Poczytałem o tablicach $_GET i $_POST i z tego co wywnioskowałem trzeba tylko dodać do pliku add.php zamiast zmiennych np. $mail wstawić $_POST['mail'], czy dobrze myślę?

    Pozdrawiam
  • #7 4616456
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Te zmienne kończace się na z prawdopodobnie miały służyć dopisaniu czegoś przed komentarzem i imieniem.

    Co do zmiennych, dobrze myślisz, samo użycie REQUEST nie jest najgorsze (to uniwersalne rozwiązanie, działa dla metod POST i GET), najgorsze jest użycie extract. Np. jeśli wyślesz w żądaniu pola imiez i komentz, funkcja extract wstrzyknie je do skryptu.

    Aby warunek sprawdzał czy któreś z pól nie jest wypełnione, trzeba to zapisać tak:
    if( a || b){...}


    Przekierowanie chyba najwygodniej zrobić za pomocą nagłówków HTTP:
    header( 'refresh: 2; url=http://www.example.net' );

    Trzeba tylko umieścić ten kod na początku skryptu (przed wysłaniem czegokolwiek do użytkownika, inaczej nie zadziała).

    Pozdrawiam, Krzysztof.
  • #8 4616704
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    krzychoocpp napisał:
    Co do zmiennych, dobrze myślisz, samo użycie REQUEST nie jest najgorsze (to uniwersalne rozwiązanie, działa dla metod POST i GET), najgorsze jest użycie extract. Np. jeśli wyślesz w żądaniu pola imiez i komentz, funkcja extract wstrzyknie je do skryptu.

    Masz racje, aczkolwiek stosowanie REQUEST może być również niebezpieczne, wszystko zależy od ustawienia pliku php.ini. Zakładając sytuację, że metodą post przychodzi zmienna imie, a złośliwy user dopisze do adresu ?imie=xyz w tablicy REQUEST 'pojawiają się' dwie zmienne imie. Parser wybiera jedną z nich, w zależności od ustawienia odpowiedniej dyrektywy w pliku php.ini. I jesli GET jest przed POST, zmienna POST zostaje nadpisana tą, od użytkownika i w ten sposób może ułatwić atak na skrypt. Zdecydowanie zalecam więc korzystanie z $_GET i $_POST.


    krzychoocpp napisał:

    Przekierowanie chyba najwygodniej zrobić za pomocą nagłówków HTTP:
    header( 'refresh: 2; url=http://www.example.net' );

    Można też tak,
    header("Location:index.php?dodano=1);

    Oszczędzisz swojemu gościowi jednego przeładowania. A w stronie głównej możesz dodać następujący kod:
    if ($_GET['dodano']=='1') {
    echo "dzięki za komentarz";
    }




    krzychoocpp napisał:

    Trzeba tylko umieścić ten kod na początku skryptu (przed wysłaniem czegokolwiek do użytkownika, inaczej nie zadziała).

    A jesli nie chce ci się poprawiać kodu, ew nie wiesz jak to zrobić możesz posłużyć się instrukcją ob_start() - wstawiasz ją na początek kodu tym samym włączając cache'owanie kodu. Dzięki temu nie martwisz się o wysyłanie nagłówków przed wysyłaniem tekstu metodą echo.
  • REKLAMA
  • #9 4616972
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    Jedne problem już rozwiązałem z wyświetlaniem informacji o braku wypełnionych pól.
    if ($koment != '') {
    fwrite (fopen("data.txt", "r+"), "<table border=0 cellpadding=0 cellspacing=0 width=100% bgcolor=#e0e0e0><td width=100%><a href=mailto:$mail class=mail>$imiez $imie</a> - Wysłany: $data<br> $komentz $koment <BR><hr noshade size=1 color=#000000> \n $fileread</td>
    </table>");
    fclose(fopen("data.txt", "a+"));
    echo ("$zobacz");
    } 
    else {
    echo ("$brak");
    }
  • #10 4616984
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    Brawo:D tylko czym jest zmienna $brak ?
  • #11 4617017
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    To zmienna $brak
    $brak="<center><a href=index.php>Wypełnij wszystkie pola, Kliknij aby powrócić do strony głównej.</a></center>";
    
  • #12 4631870
    Konto nie istnieje
    Konto nie istnieje  
  • #13 4632030
    Mody
    Poziom 25  
    Posty: 922
    Pomógł: 42
    Ocena: 28
    Dalej pracuje nad tym skryptem aby pozbyć się extract($_REQUEST)

    s_z_a_m_a_n napisał:
    Mody napisał:
    To zmienna $brak
    $brak="<center><a href=index.php>Wypełnij wszystkie pola, Kliknij aby powrócić do strony głównej.</a></center>";
    

    Jeszcze przydało by się popracować nad tym, żeby po powrocie do wypełniania formularza zachowane były uprzednio wpisane dane - np. ktoś napisze obszerny komentarz a zapomni się podpisać a tu zonk, wszystko przepadło…


    Skrypt nie przepuści jeśli nie wpiszemy imienia i komentarza, ale z tym
    zapamiętanie to dobry pomysł. Na razie się dokształcam z php więc
    szybko mi nie pójdzie. Wydaje mi się, że trzeba będzie zrezygnować z
    przeładownia strony i zastosować propozycję kolegi ostry_18. Jeśli
    wykonam jakieś poprawi zamieszczę cały kod do sprawdzenia.

    Pozdrawiam

    if ($koment != '' && $imie != '') {
    fwrite (fopen("data.txt", "r+"), "<table border=0 cellpadding=0 cellspacing=0 width=100% bgcolor=#e0e0e0><td width=100%><a href=mailto:$mail class=mail>$imiez $imie</a> - Wysłany: $data<br> $komentz $koment <BR><hr noshade size=1 color=#000000> \n $fileread</td>
    </table>");
    fclose(fopen("data.txt", "a+"));
    echo ("$zobacz");
    } 
    else {
    echo ("$brak");
    }
  • #14 4633904
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    Dla zmniejszenia liczby przeładowań mogę zaproponować jeszcze JavaScriptowy skrypcik :), który sprawdzałby przynajmniej przed przesłaniem formularza dalej, czy gość wpisał cokolwiek w polach nick i jakąkolwiek treść wpisu, dłuższą powiedzmy niż 8 znaków. Jak cię to zainteresuje daj znać, napiszę ci ogólnie jak ma wyglądac kod.
    Oczywiście potem w php po wysłanu danych musisz i tak je dostałnie przefiltrować, ale ten JS to tak żeby zniwelować niepotrzebne przeładowania strony.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu w skrypcie PHP obsługującym komentarze, który pozwala na dodawanie pustych wpisów bez treści i nazwy użytkownika. Rozwiązaniem jest wprowadzenie warunków sprawdzających, czy zmienne odpowiadające za imię użytkownika ($imie) i treść komentarza ($koment) nie są puste przed zapisem do pliku. Zwrócono uwagę na ryzyko stosowania funkcji extract($_REQUEST), która może prowadzić do niebezpiecznych skutków i zalecane jest używanie bezpośrednio tablic $_POST i $_GET wraz z odpowiednim filtrowaniem danych wejściowych. Zaproponowano także implementację mechanizmu przekierowania po dodaniu komentarza za pomocą nagłówków HTTP (header) lub parametru w URL, aby automatycznie powrócić do strony głównej po określonym czasie. Wskazano na możliwość dodania walidacji po stronie klienta za pomocą JavaScript, która ograniczy wysyłanie pustych lub zbyt krótkich komentarzy, zmniejszając liczbę niepotrzebnych przeładowań strony. Poruszono również temat zachowywania wcześniej wpisanych danych w formularzu w przypadku błędu, co poprawiłoby komfort użytkownika. Całość kodu opiera się na zapisie komentarzy do pliku tekstowego "data.txt" z formatowaniem HTML, jednak zasugerowano uproszczenie struktury i eliminację zbędnych tabel. Dyskusja zawiera przykładowe fragmenty kodu warunkowego sprawdzającego zawartość pól oraz wskazówki dotyczące poprawnego umieszczenia funkcji header() przed wysłaniem jakiejkolwiek treści do przeglądarki.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA