Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111

    nessun risultato dalla query

    ciao a tutti, ho un problema con questa funzione che ho scritto:
    Codice PHP:
    function validazione ($URLK$CODICE) {

      
    $val_query sprintf("SELECT * FROM captcha WHERE CODICE='%s' AND URLK='%s'",
                    
    mysql_real_escape_string($CODICE), 
                   
    mysql_real_escape_string($URLK));
      
      
    //$val_query = "SELECT CODICE, URLK FROM captcha WHERE CODICE='$CODICE' AND URLK='$URLK' ";
                   
      
    $val mysql_query($val_query) or die(mysql_error());
      
    $trovati mysql_num_rows($val);
      echo 
    $trovati;
      if (!
    $trovati) {
        
    $checkpoint "ERRORE: il codice inserito non è valido";
        return 
    $checkpoint;
      }
        
    $checkpoint "ok";
        return 
    $checkpoint;


    il problema è che $trovati è sempre =0, come mostra l'echo.
    il problema è quasi certamente qui, perchè ho verificato che la funzione riceve degli argomenti corretti. devo usare una sintassi particolare per passare gli argomenti alla funzione dato che è in un file include?
    ho provato con entrambe le query ($val_query) ma non funziona in nessun caso.
    immagino sia un problema di sintassi nelle query...

  2. #2
    prova ad aggiungere un
    Codice PHP:
    echo $val_query
    poi prendi il testo della query che stampa nella pagina e lo esegui da phpadmin.

    Se anche phpadmin restituisce 0 righe vuol dire che il problema sta nella query e non nel codice php.

    Il codice php (almeno fino alla riga che restituisce il numero di righe) sembra corretto.
    (Ipotizzo che l'esecuzione della query non resituisca errori, visto che ti scrive il numero di righe.)


    Ipotizzando sia un problema di query, i quesiti sono:

    1. Esiste in DB almeno 1 elemento con quei valori?

    2. Puoi dare un esempio di CODICE e URLK passati alla funzione ed quali righe dovrebbe tirare fuori?

    3. Utilizzi l'operatore '=', magari ci stava meglio un 'like'? (che comunque non credo dato quello che hai scritto).

    Postaci anche la query che vai a verificare su phpadmin, così da avere più dati possibili per risponderti.

    Così su 2 piedi la sintassi della query sembra corretto.
    Potrebbe essere un problema di maiuscole/miniscole o di spazi che sono rimasti.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    grazie della risposta precisa

    purtroppo ho trovato che il problema è banale ma me ne sono accorto solo ora: $URLK è una stringa di una ventina di caratteri generata con una funzione random che viene passata al database quando viene creata (assieme a una chiave di conferma e alla data di scadenza). ogni volta la funzione genera 10 coppie di chiavi.
    quest'altra funzione deve verificare che la stringa e il codice di conferma che l'utente deve digitare esistano in coppia nel database.
    per cui la variabile $CODICE viene presa dalla superglobal $_POST, mentre la $URLK la passavo direttamente dal database dopo aver scelto in modo random una coppia di chiavi non scadute.

    il problema è che quando clicco sul pulsante per inviare il form la pagina viene aggiornata e viene richiamata una nuova coppia di chiavi dal database. quindi $CODICE è corretta ma $URLK non vi corrisponde più.

    l'unica soluzione che mi viene in mente è di passare anche $URLK tramite la superglobal $_POST, per mezzo di un textfield di input nascosto.
    qualcuno conosce soluzioni più eleganti? qualche modo di non far aggiornare quella variabile quando viene postata la form?

  4. #4
    Potresti assegnare un nome al tasto di submit e in fase di generazione della pagina far generare la nuova coppia di chiavi solo se in $_POST tale variabile non è valorizzata.

    esempio:

    <form method="POST">
    <input type="text" name="testo">
    <input type="submit" value="ArrivoDaForm" name="test">
    </form>
    Codice PHP:
    .....
    if (
    $_POST['test']<>"ArrivoDaForm"){
     
    //Genero Nuove chiavi 
    }
    ..... 
    Resta il fatto che per mantenere corrispondenza tra CODICE e URLK prima e dopo il submit, il valore di URLK deve essere memorizzato.
    Puoi inserirlo in $_SESSION (se utiulizzi le sessioni) in modo che non sia scritto in "chiaro" nel codice della pagina quale stai utilizzando.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    grazie del suggerimento!
    ho optato per usare $_SESSION. questo è il codice che va a scegliere una coppia di chiavi dal database. ho aggiunto una IF simile a quella che mi hai suggerito in modo che una chiava venga passata alla session solo se necessario.
    le parti commentate servono per debug

    Codice PHP:
    nuovocaptcha ();

    mysql_select_db($database_cnblogdb$cnblogdb);
    $query_rscaptcha "SELECT * FROM captcha
                     WHERE SCADENZA > NOW()
                         ORDER BY RAND() 
                     LIMIT 1"
    ;
    $rscaptcha mysql_query($query_rscaptcha$cnblogdb) or die(mysql_error());
    $row_rscaptcha mysql_fetch_assoc($rscaptcha);

    //echo "Session esistente:" . $_SESSION['CODICE'] . "
    ";

    if (!isset(
    $_SESSION['CODICE']))  {    
       
    $_SESSION['CODICE'] = $row_rscaptcha['CODICE'];
       //echo "
    session aggiornata 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    nuova session:" . $_SESSION['CODICE'] . "
    ";
    } /*else {
        echo "
    session già presente 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    session esistente:" . $_SESSION['CODICE']. "
    ";
    }*/ 
    usando le session bisogna ricordarsi di aprirla:
    Codice PHP:
    if (!isset($_SESSION)) {
      
    session_start();

    e svuotarla quando non ci serve più, in modo che possiamo riutilizzare il codice qui sopra senza riavviare il browser. io ho messo questa stringa:
    Codice PHP:
    unset ($_SESSION['CODICE']); 
    dopo aver passato le chiavi da $_POST['CHIAVE'] e $_SESSION['CODICE'] in altre variabili per essere utilizzate da un'altra funzione (quella di controllo).

    funziona tutto alla grande!
    ho usato questo sistema per inserire un captcha nel modulo di iscrizione al sito. però mi sembra molto più sicuro che memorizzare dei dati sensibili nella $_SESSION, sbaglio?
    se applicassi questo sistema anche per il login degli utenti andrei solo a complicarmi la vita? o avrei effettivamente un sito più sicuro?

    PS: ho cambiato il nome delle variabili rispetto al primo post:
    $CODICE --> CHIAVE
    $URLK --> $CODICE
    (scusa per la confusione)

  6. #6
    Originariamente inviato da v.1
    Codice PHP:
    nuovocaptcha ();

    mysql_select_db($database_cnblogdb$cnblogdb);
    $query_rscaptcha "SELECT * FROM captcha
                     WHERE SCADENZA > NOW()
                         ORDER BY RAND() 
                     LIMIT 1"
    ;
    $rscaptcha mysql_query($query_rscaptcha$cnblogdb) or die(mysql_error());
    $row_rscaptcha mysql_fetch_assoc($rscaptcha);

    //echo "Session esistente:" . $_SESSION['CODICE'] . "
    ";

    if (!isset(
    $_SESSION['CODICE']))  {    
       
    $_SESSION['CODICE'] = $row_rscaptcha['CODICE'];
       //echo "
    session aggiornata 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    nuova session:" . $_SESSION['CODICE'] . "
    ";
    } /*else {
        echo "
    session già presente 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    session esistente:" . $_SESSION['CODICE']. "
    ";
    }*/ 
    Solo per diritto di cronaca, così vai sempre ad eseguire una query sul DB anche quando poi (sembra) non te ne fai di nulla.

    Se i valori di $row_rscaptcha non ti servono in momenti successivi, è consigliabile optare per questo codice:
    Codice PHP:
    mysql_select_db($database_cnblogdb$cnblogdb);
    //echo "Session esistente:" . $_SESSION['CODICE'] . "
    ";
    if (!isset(
    $_SESSION['CODICE']))  {    
     
    $query_rscaptcha = "SELECT FROM captcha
                     WHERE SCADENZA 
    NOW()
                         
    ORDER BY RAND() 
                     
    LIMIT 1";
     
    $rscaptcha = mysql_query($query_rscaptcha$cnblogdb) or die(mysql_error());
     
    $row_rscaptcha = mysql_fetch_assoc($rscaptcha);
      
    $_SESSION['CODICE'] = $row_rscaptcha['CODICE'];
       //echo "
    session aggiornata 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    nuova session:" . $_SESSION['CODICE'] . "
    ";
    } /*else {
        echo "
    session già presente 
     RS
    :" . $row_rscaptcha['CODICE'] . "
     
    session esistente:" . $_SESSION['CODICE']. "
    ";
    }*/ 
    In modo che ti risparmi un di elaborazioni in cui hai già il codice in $_SESSION.

    Se invece i valori ricavati dalla query ti servono per altri controlli successivi alla porzione di codice postata, va benissimo come lo hai scritto.

    Originariamente inviato da v.1

    dopo aver passato le chiavi da $_POST['CHIAVE'] e $_SESSION['CODICE'] in altre variabili per essere utilizzate da un'altra funzione (quella di controllo).

    funziona tutto alla grande!
    ho usato questo sistema per inserire un captcha nel modulo di iscrizione al sito. però mi sembra molto più sicuro che memorizzare dei dati sensibili nella $_SESSION, sbaglio?
    se applicassi questo sistema anche per il login degli utenti andrei solo a complicarmi la vita? o avrei effettivamente un sito più sicuro?

    PS: ho cambiato il nome delle variabili rispetto al primo post:
    $CODICE --> CHIAVE
    $URLK --> $CODICE
    (scusa per la confusione)
    Scusa ma non ho capito bene.
    Quale è il motodo che hai utilizzato per inserire il captcha nel modulo di iscrizione?
    l'uso di $_SESSION o altro?

    Comunque, generalmente possono esistere diversi metodi relativamente sicuri per fare la stessa cosa.
    Quindi per valutare se cambiando il sistema di gestione del login ti vai solo a complicare la vita oppure se hai un effettivo (e significativo) incremento della sicurezza si deve sapere come hai fatto quello attuale.

    Io nell'utilizzo delle sessioni mi sono sempre trovato abbastanza bene, ma non so dirti quali se esistono problemi di sicurezza legate.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    Originariamente inviato da DragonOfLight
    Solo per diritto di cronaca, così vai sempre ad eseguire una query sul DB anche quando poi (sembra) non te ne fai di nulla.
    già non pensavo fosse grave far lavorare un po' il server a vuoto.. un pochino soltanto

    Scusa ma non ho capito bene.
    Quale è il motodo che hai utilizzato per inserire il captcha nel modulo di iscrizione?
    l'uso di $_SESSION o altro?
    non ho capito cosa nonhai capito
    io ho una form da compilare con nome cognome etc, ci ho aggiunto un'altro campo per il captcha. l'utente deve inserire il codice che vede in un immagine o qualcosa del genere (questo lo devo ancora fare, perchè non voglio usare le librerie GD).
    il codice che l'utente deve leggere è stato selezionato randomicamente da quel recordset e dovrà venir passato a una funzione in grado di elaborare un'immagine. quindi varia ogni volta che la pagina viene ricaricata. invece l'altro codice di conferma deve rimanere fisso prima e dopo che la form viene inviata al server. per questo ho dovuto salvarlo nella session.

    Codice PHP:
    if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "nuovo")) {
            
    $CHIAVE $_POST['CHIAVE'];
            
    $CODICE $_SESSION['CODICE'];
            
    $check validazione ($CODICE$CHIAVE);
            unset (
    $_SESSION['CODICE']);
            if (
    $check !== "ok") {
               echo 
    $check;
               echo 
    "<script language=javascript>alert('ERRORE: codice non corretto.')</script>";
               } else {       
    /*qui c'è il codice per salvare i dati della form nel database, 
                                               cioè una query tipo INSERT INTO.. */ 
    questo è il codice che discrimina se salvare o meno i dati nel database. MM_insert è il nome dell'input.


    Comunque, generalmente possono esistere diversi metodi relativamente sicuri per fare la stessa cosa.
    Quindi per valutare se cambiando il sistema di gestione del login ti vai solo a complicare la vita oppure se hai un effettivo (e significativo) incremento della sicurezza si deve sapere come hai fatto quello attuale.

    Io nell'utilizzo delle sessioni mi sono sempre trovato abbastanza bene, ma non so dirti quali se esistono problemi di sicurezza legate.
    attualmente il login lo faccio con le $_SESSION. nella session viene memorizzato il nickname dell'utente. forse sarebbe più sicuro usare delle chiavi generate randomicamente di volta in volta che vengono assegnate a tutti gli utenti e salvate in database in coppia con nickname e password. quindi al momento del login si andrebbe a verificare che nel database sia presente anche quella chiave usata oltre a nickname e password. sarebbero 3 elementi da verificare anzichè 2. inoltre nella session potrei salvare la chiave anzichè il nickname, che mi sembra un dato meno sensibile. basta eliminare tutti gli altri utenti associati a quel codice una volta che uno lo usa per loggarsi, anzi non serve tanto la session riconosce l'indirzzo ip giusto?

  8. #8
    Originariamente inviato da v.1
    già non pensavo fosse grave far lavorare un po' il server a vuoto.. un pochino soltanto
    beh se hai un server dedicato di certo non è un problema... ma se sei su un hosting condiviso, anche il risparmio di 1 giro a vuoto può appesantire il server.
    pensa a 100 diversi siti hostati su cui c'è uno script che gira "a vuoto".
    Se questi 100 siti hanno 100 visite, sono ben 10.000 operazioni fatte per nulla per singolo accesso.
    Quello che ne risente di più non è tanto il server (al massimo chi hosta il sito può cambiarlo con macchine più potenti o può fregarsene e fare lavorare a pieno carico le macchine) ma l'utente che
    deve attendere più tempo per il caricamento della pagina.

    Lo so, sto un po esagerando, ma era per estremizzare e far capire che anche l'ottimizzazione è una cosa importante quando si programma.

    Ti dico questo in quanto in ufficio, in lan ma su macchine non pienamente ottimizzate, un programma scritto bene (ma non ottimizzato)impiegava quasi 7 ore a girare, mentre ottimizzandolo fa il tutto in meno di 5 minuti.
    E' bastato cambiare 3-4 righe di codice, ma il server ne ha beneficiato assai

    Originariamente inviato da v.1
    attualmente il login lo faccio con le $_SESSION. nella session viene memorizzato il nickname dell'utente. forse sarebbe più sicuro usare delle chiavi generate randomicamente di volta in volta che vengono assegnate a tutti gli utenti e salvate in database in coppia con nickname e password. quindi al momento del login si andrebbe a verificare che nel database sia presente anche quella chiave usata oltre a nickname e password. sarebbero 3 elementi da verificare anzichè 2. inoltre nella session potrei salvare la chiave anzichè il nickname, che mi sembra un dato meno sensibile. basta eliminare tutti gli altri utenti associati a quel codice una volta che uno lo usa per loggarsi, anzi non serve tanto la session riconosce l'indirzzo ip giusto?
    Non sono il più adatto per rispondere, magari se passa qualcuno di più competente di darà più informazioni e più certezze.

    Comunque ce provo lo stesso

    ..vuoi mai che passa qualcuno che me smentisce, così da imparare qualcosa di nuovo con "poco sforzo"?


    In teoria i file di sessione sono salvati sul server. e sul pc locale viene salvato un cookie con l'id della sessione aperta.
    Su server che ospitano diversi siti, può capitare che tutti i file di sessione dei vari siti siano salvati nella medesima cartella.
    Quindi basta che 1 sito abbia grossi vulnerabilità che si ha sottomano tutti i dati delle varie sessioni.

    Quindi applicando controlli incrociati sessione/db si ha una maggiore sicurezza.

    nel caso in cui qualcuno rientra in qualche modo a recuperare i dati della sessione dal disco del server, se su questo vi è solo un codice difficilmente potrà entrare nel sito.

    (il codice salvato in $_SESSION è la chiave della tabella SESSIONI creata nel proprio db nel quale contiene tutti i dati che servono per verificare se l'utente è loggato o meno).

    Quindi in $_SESSION salvo la variabile ID_SESSIONE (una stringa generata casualmente) nessuno può accedere agli altri fati sensibili.
    nel db si avrà una tabella SESSIONI con dentri i vari campi:
    id_sessione
    uname (nome utente)
    upwd (hash password utente)
    uip (indirizzo ip)
    udata (data/ora Login o ultima operazione)
    Credo che il sito sarebbe più sicuro. Ma per il tuo utilizzo, tutta questa sicurezza è necessaria o ti puoi accontentare di qualcosa meno sicuro, ma che già è scritto e funzionante?

    Se non hai scadenze strette, ti consiglio di apportare le modifiche per renderlo più sicuro.
    Se invece hai scadenze (o magari vuoi pubblicare il sito il prima possibile) puoi prevedere questa modifica in un successivo intervento sul sito, atto all'ottimizzazione e alla correzione di alcuni piccoli bug che verranno fuori.

    Aspettiamo comunque gente più competente per sapere quanto la ho sparata grossa

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    mmm
    io di php so proprio poco ma da quel che ho capito la $_SESSION non ha nessun legame con alcun database. è un semplice array (infatti ci posso mettere tutti i dati che voglio, non solo utenti e password). anche il modo di controllarla è tipico di un'array e non c'è bisogno di alcuna istruzione che ricordi lontanamente una query per database.
    semplicemente credo che i valori contenuti nella variabile vengano conservati nella memoria del server per un tempo che può essere definito anche nella variabile stessa, o finchè esiste la connessione con il client.
    tutte le altre variabili vengono invece eliminate dalla memoria quando si apre una nuova pagina.

  10. #10
    spe spe.. forse ti ho creato un po di confusione..

    con SESSIONI intendo il nome una tabella creata dall'utente per una gestione propria.

    con $_SESSION intendo il vettore della sessione creatas in PHP.


    la sessione in PHP non è altro che una sorta di array gestito dal server e memorizzato su un file di testo.
    L'accesso a tale file è gestito in maniera automatica dal PHP tramite la variabile $_SESSION.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.