Visualizzazione risultati 1 fino 14 di 14

Discussione: Funzione leggi/scrivi file PHP

  1. #1
    ipincirock non è connesso Neofita
    Data registrazione
    21-08-2010
    Messaggi
    7

    Predefinito Funzione leggi/scrivi file PHP

    Salve a tutti, ho iniziato appena stamattina a giocare col php, vorrei creare una sort di guestbook.
    Nella parte send, richiamata da una form su una pagina html ho questo codice
    Codice PHP:
    <html>

    <?php
    $file
    =fopen("messaggi.txt","a+");
    $riga = "Nome=". $fname. ";". "Messaggio=" . $messaggio . ";" ."\n";
    fputs($file, $riga);
    fclose($file);
    ?>
    <body bgcolor="black">
    <p style="color:red;">Messaggio scitto, grazie :)</p></body>
    <a href="index.html"> Ritorna a home</a>
    </body>
    </html>
    Son andato a vedere il file messaggi.txt ma questo non è aggiornato con quello che ho scritto.In più non ho messaggi di errore.Ma mi compare la pagina che volevo.
    Qualcuno ha la pazienza di aiutarmi?
    Saluti

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    Non funziona perché $messaggio e $fname non sono inizializzati... cioè non hanno nessun valore!.

    Ciao!

  3. #3
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Credo che voglia accedere ai parametri GET (o POST) passati dalla pagina con il form, ma non funziona perché la direttiva register_globals è disattivata. Non ti consiglio di attivarla, poiché potrebbe causare problemi di sicurezza. Al posto di $messaggio usa $_GET["messaggio"], se l'attributo method dell'elemeto form è invece impostato su post, allora dovrai usare $_POST["messaggio"].
    Se hai ancora qualche dubbio o problema, posta anche il codice della pagina con il form.

  4. #4
    ipincirock non è connesso Neofita
    Data registrazione
    21-08-2010
    Messaggi
    7

    Predefinito

    Allora, innanzitutto volevo ringraziarvi di cuore per le vostre rapide risposte.
    Karl94 ha inquadrato meglio la situazione infatti il mio codice HTML per la form è
    Codice PHP:
    <form action="guestbook_send.php" method="post">
    <
    p><span style="color: red;">Name:</span>&nbsp;&nbsp;&nbsp;&nbsp; <input name="fname" type="text" /></p>
    <
    p><span style="color: red;">Message: </span><input name="messaggio" type="text" /></p>
    <
    input value="Send us :)" type="submit" /></form>
    L'attributo method è post ho quindi cambiato il guestbook_send.php in
    Codice PHP:
    <html>

    <?php
    $file
    =fopen("messaggi.txt","a+");
    $riga = "Nome=". $_POST["fname"]. ";". "Messaggio=" . $_POST["messaggio"] . ";" ."\n";
    fputs($file, $riga);
    fclose($file);
    ?>
    <body bgcolor="black">
    <p style="color:red;">Messaggio scitto, grazie :)</p></body>
    <a href="index.html"> Ritorna a home</a>
    </body>
    </html>
    ma continua a non funzionare, inoltre il il file credo non sia stato prorpio toccato infatti la data di ultima scrittura non è aggiornata. Io ho riempito in maniera fittizia il file con 2 righe scritte nella sintassi di parsing del .php in modo da verificare se la scrittura "append" funzionasse a dovere. Saresti così gentile da aiutarmi ancora, o insomma chi ha tempo ?
    PS: Non ho modificato variabili globali come quella enunciata da karl94

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    a me quel sorgente funziona !

    Comunque, l'ho modificato con dei controlli:

    Codice PHP:
    <html>
    <body bgcolor="black">
    <p style="color:red;">
    <?php
    $file
    =fopen("messaggi.txt","a+");
    if(!isset(
    $_POST["fname"],$_POST["messaggio"]))
    echo
    'Uno o piu campi non sono settati';

    if(empty(
    $_POST["fname"]) || empty($_POST["messaggio"]))
    echo
    'Riempi tutti i campi!';

    $riga = "Nome=". $_POST["fname"]. ";Messaggio=" . $_POST["messaggio"] . ";\n";
    if(
    fputs($file, $riga) === FALSE)
    echo
    'Errore nella scrittura!';
    else
    echo
    'Messaggio scitto, grazie :)';
    fclose($file);
    ?>
    </p></body>
    <a href="index.html"> Ritorna a home</a>
    </body>
    </html>
    ...FORSE ti può interessare..

    E se vuoi scrivere il testo inviato in una pagina web, dovresti prima farlo passare nella htmlentities()

    Se non ti funziona:

    1- il file php ha estensione *.php? (mi pare di si, visto che hai scritto "guestbook_send.php"
    2-Sei sicuro che il file "guestbook_send.php" sia scritto bene? Controlla le eventuali maiuscole, perché è case-sensitive!


    Il mio sorgente, comunque, è da modificare.. cioè ho scritto come andrebbero fatti i controlli, ma ad esempio anche se c'é un errore comunque tenta di scrivere sul file

    Ciao!
    Ultima modifica di alemoppo : 22-08-2010 alle ore 19.56.56

  6. #6
    ipincirock non è connesso Neofita
    Data registrazione
    21-08-2010
    Messaggi
    7

    Predefinito

    Grazie alemoppo, allora, mi son permesso di modificar il sorgente con quello che mi hai scritto :) Mi da "errore nella scrittura"
    Se è come le fwrite della stdio da false perchè non riesce a scrivere, come se ci fosse un problema di permessi, ma come cambio i permessi al file? Non so se sia permesso maneggiar questi dati sul server altervista

    ------

    Rettifico, ora va, ho cambiato i permessi da gftp :) Devo capir adesso quele gruppo può scrivere il file..A dire il vero però mi da un pò fastidio che se scrvio la url del txt compaia..è possibile mettere dei file "invisibili" da http? Nel file di apache della configurazione globale mi pareva si possa fare ma qui?
    Ultima modifica di andreafallico : 22-08-2010 alle ore 20.22.43 Motivo: usa il tasto Edita

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    Citazione Originalmente inviato da ipincirock Visualizza messaggio
    A dire il vero però mi da un pò fastidio che se scrvio la url del txt compaia..è possibile mettere dei file "invisibili" da http? Nel file di apache della configurazione globale mi pareva si possa fare ma qui?

    Devi scrivere su .htacces una cosa come:

    Codice:
    <Files ~ "file.txt$">
    Order allow,deny
    Deny from all
    Satisfy All
    </Files>
    Per raggiungere .htacces, vai sul pannello di controllo, poi clicca sull'ingranaggio (in gestione files).

    Poi su avanzate metti il sorgente sopra, modificando il nome del file, ovviamente

    Maggiori info.

    Ciao!
    Ultima modifica di alemoppo : 22-08-2010 alle ore 20.35.54

  8. #8
    ipincirock non è connesso Neofita
    Data registrazione
    21-08-2010
    Messaggi
    7

    Predefinito

    Ti ringrazio enormemente :) Fa proprio quel che deve fare! Adesso non mi rimane che studiar qualcosa che eviti exploit o code iniection da quei textbox, e poi far la parte di visione della guestbook. pensavo che i tutorial di w3cschool fossero sufficenti invece mi sbagliavo. :(

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    per evitare i code iniection o altro (non mi intendo dei nomi ^^), io uso la htmlentities() (linkata prima) che in pratica trasforma tutti i tag html nei rispettivi codici in modo di essere visibili anche in pagine html...

    poi, per la code iniection (intendo via MYSQL), io uso la mysql_real_escape_string()

    ..Comunque, io ho imparato soltanto leggendo questo forum.. e non ho letto nessuna guida!...

    Secondo me il modo migliore per imparare non è tanto leggere le guide, ma scrivere codice e testarlo con l'aiuto della documentazione.
    Poi, questo forum è ricchissimo di info utili

    Ciao!
    Ultima modifica di alemoppo : 22-08-2010 alle ore 21.23.39

  10. #10
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Scusate se mi intrometto nella discussione, ma questa discussione mi sta cominciando ad interessare.

    @alemoppo: credo che te parli dei code injector, ovvero l'inserimento di codice tramite un bug del sistema che gestisce il guestbook, in questo caso, invece per quando riguarda l'SQL injector, ovvere il code injector applicato su un db mysql basta che eviti, ho in qualche modo non fai elaborare nel codice sql i caratteri <, /, ecc..

    Da quello che so l'SQL injector utilizza questi caratteri, seguiti da operatori logici a scopo di modificare la query sql.

    Cmq, in ogni caso, quello detto da alamoppo può evitare SQL injection, almeno fino a che qualcuno non trovi, se esistono, dei bug nel tuo sistema, ma, se ti interessa, io al posto di un file txt e un db mysql, proprio per evitare SQL Injection, utilizzerei un file xml, ovviamente sempre se lo sai usare.
    Ultima modifica di sevenjeak : 22-08-2010 alle ore 22.00.30

    Sevenjeak
    Software developer and much more

  11. #11
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    Citazione Originalmente inviato da sevenjeak Visualizza messaggio
    Da quello che so l'SQL injector utilizza questi caratteri, seguiti da operatori logici a scopo di modificare la query sql.
    Sì.. infatti la mysql_real_escape_string() fa proprio l'escape...

    Le SQL injector si basano sul fatto che se la query è ad esempio:

    Codice PHP:
    mysql_query('SELECT * FROM utenti WHERE nick='.$nick.' AND password='.$password);
    Se mettiamo che la password è:

    Codice PHP:
    ' or password != ""'
    ovviamente la query sarà giusta per qualsiasi nick

    Quindi la mysql_real_escape_string() fa l'escape delle varie single_quote( ' ) rendendo inefficace l'attacco...

    p.s.
    Codice PHP:
    ' or password != ""'
    non mi ricordo bene.. ci dovrei pensare un secondo, ma non è intenzione del 3d parlare di queste cose (andiamo OT)...

    Mentre l'html_entities() serve quando mostri sul sito le scritte degli utenti (possono essere commenti, risposte ecc ecc...).

    In questo caso, un utente potrebbe fare un bel
    Codice HTML:
    <script>
    while(1);
    </script>
    impallando letteralmente il browser...anche se poi i browser riescono a difendersi

    oppure ancora più "bastardo" è questo:
    Codice HTML:
    <script>
    while(1)
    alert("ciao!");
    </script>
    Infatti la htmlentities() trasformerà i vari < in &lt; e i > in &gt; rendendo inefficente l'attacco...

    ..vabbè, se continuiamo con qeusto argomento siamo OT (anche se un po queste ultime cose centrano con le funzioni per scrivere/leggere... )

    Ciao!

    EDIT:

    Ovviamente con queste non si protegge al 100% il sito: ovviamente nessun sito o sistema è sicuro al 100%... Però possiamo fare tanto rendendo decenti i nostri script PHP
    Ultima modifica di alemoppo : 23-08-2010 alle ore 00.32.10

  12. #12
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Più che altro io, per sostituzione dei caratteri, intendevo far riferimento alla funzione str_replace(), cmq, non è che cambia utilizzando una o l'altra, solo che io, non so se e solo una mia abitudine, ma preferirei evitare l'escape su tutta la stringa.

    Cmq credo, non so voi, che l'autore del 3d abbia risolto il problema, se l'ultima risposta, e le risposte successive, dovessero essere OT almeno sono servite a dare delle informazioni in più sulle varie funzioni di php e sui code injection.
    Ultima modifica di sevenjeak : 23-08-2010 alle ore 08.27.55

    Sevenjeak
    Software developer and much more

  13. #13
    ipincirock non è connesso Neofita
    Data registrazione
    21-08-2010
    Messaggi
    7

    Predefinito

    No no non sono assolutamente OT!!! Perchè sto cercando di risolvere proprio questo problema, dato che ero riucito a exploitarmi da solo il guestbook provando a lanciare uno script...ovviamente il problema è durante la visualizzazione del guestbook più che nell'invio del messaggio.
    A dire il vero pensavo che
    Codice PHP:
    $namegood = filter_input(INPUT_POST, 'fname', FILTER_VALIDATE_REGEXP, array(
    'options' => array(
    'regexp' => "/[a-z]{3,}/i")));
    bastasse ma a quanto pare non fa proprio nulla. Ora provo con le htmlentitties()

    si funziona con
    Codice PHP:
    echo "<hr/>". htmlentities(fgets($file), ENT_QUOTES). "<br />";
    In ogni caso voglio davvero ringraziarvi tutti per la vostra pazienza e cordialità nell'aiutarmi :)
    Ultima modifica di ipincirock : 23-08-2010 alle ore 14.39.27 Motivo: aggiunta

  14. #14
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    Citazione Originalmente inviato da ipincirock Visualizza messaggio
    No no non sono assolutamente OT!!!
    vabbè, il 3d si intitola "Funzione leggi/scrivi file PHP" e non sicurezza sui file o boh...

    Comunque, vorrei aggiungere soltanto che la htmlentities() non solo trasforma i caratteri speciali tipo i "<" e i ">", ma ha di buono che trasforma addirittura anche le lettere accentate ad esempio trasforma la à in &agrave;...

    RICORDATE PERO' DI CONTROLLARE I CHARSET!(UTF-8 o ISO)... altrimenti se a iso gli date una stringa in UTF-8 si vedranno molte "Ã"; viceversa invece si vedranno caratteri cinesi e/o quadratini!.. Quindi ovviamente i charset della pagina e quello con cui è stato scritto devono coincidere! Per adattare il charset, occorre leggere direttamente dal manuale PHP

    Ciao!

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •