Visualizzazione risultati 1 fino 14 di 14

Discussione: Mysql è un bambino burlone

  1. #1
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito Mysql è un bambino burlone

    Il mio problema può essere "ridicolo", ma penso che mysql sia un "bambino" capriccioso!

    Codice PHP:
    $titolo=$_POST['titolo'];
    $contenuto=$_POST['contenuto'];
    $posizione=$_POST['posizione'];
    $totale="<h2>$titolo</h2><iframe width='400px' height='250px' src='http://www.youtube.com/embed/".$contenuto."' frameborder='0' allowfullscreen></iframe>";
    mysql_query("INSERT INTO contenuti (contenuto , posizione) VALUES('$totale' , '$posizione')") or die(mysql_error());
    Cosa c'è di sbagliato in questo banale script? NOn credo sia sbagliato mysql dice di si, mi dà errore:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '400px' height='250px' src='http://www.youtube.com/embed/Inserisci contenuto' fra' at line 1
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

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

    Predefinito

    Prova così:

    Codice PHP:
    mysql_query("INSERT INTO contenuti (contenuto , posizione) VALUES('".mysql_real_escape_string($totale)."' , '".mysql_real_escape_string($posizione)."')") or die(mysql_error());
    ...Credo che i singoli apici gli danno fastidio. mysql_real_escape_string() aggiunge i backslash davanti agli apici, effettuando l'escape.
    Consiglio: in generale, quando passi a mysql delle variabili, falle passare sempre dentro quella funzione...

    Ciao!
    Ultima modifica di alemoppo : 01-09-2011 alle ore 03.07.21

  3. #3
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito

    Aia, la mysql_real_escape_string() proprio quella che odio, comunque grazie per il consiglio! Ottimo! Grazie!
    Ultima modifica di memai : 01-09-2011 alle ore 03.20.33
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

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

    Predefinito

    la odi?? Ma come! Ti salva dalle sql_injection!

    Se proprio non la vuoi usare, puoi usare brutalmente la str_replace(), sostituendo i singoli apici: ' con un backslash + singolo apice: \' (ma non lo consiglio, in questo caso... Visto che c'é una funzione apposta {ottimizzata}, non vedo perché non usarla!).
    Come ho detto prima, la dovresti SEMPRE usare, per ogni variabile passata a mysql!

    Comunque, funziona?

    Ciao!
    Ultima modifica di alemoppo : 01-09-2011 alle ore 03.19.21

  5. #5
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito

    Si grazie, funzione

    E comunque perchè salvarsi dalle sql_injection? Io preferisco combatterle, per esempio migliorando la sicurezza a modo mio, non mi piace usare mysql_real_escape_string()
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

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

    Predefinito



    E come le combatti, se non con quella funzione o con la str_replace() ?

    Se serve, fammi un banale esempio di login, per evitare che un utente si logghi con un nick qualsiasi (sfruttando, ovviamente, sql_injection)...

    ..va bene che altervista ha la safe_mode attiva, quindi per i dati nei form non ci son problemi, ma è sempre bene prendere le giuste cautele...

    Ciao!
    Ultima modifica di alemoppo : 01-09-2011 alle ore 03.36.36

  7. #7
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito

    Credo ma spero di sbagliare nel dire che probabilmente tu hai ragione, se usare l'sql inject sta nel cambiare il metodo di selezione in PHP per far funzionare il login, si potrebbe, per quanto ne so io di sql inject, si potrebbe non far permettere all'utente di usare il carattere ' , appena trova quel carattere, blocca tutto, in parole pover il str_replace() che hai detto

    Merda mi hai fottuto


    oppure tutto sta nella registrazione, perchè si usa la sql injection? per loggarsi, si dovrebbe permettere all'utente di loggarsi ad un sito con un codice laddove nel sito quel codice non ci sarà da nessuna parte solo nel database, a sto punto è solo la colpa dell'utente se qualcuno riesca a trovarne il codice,.

    Per il moment non so che altro dire
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

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

    Predefinito

    Citazione Originalmente inviato da memai Visualizza messaggio
    per loggarsi, si dovrebbe permettere all'utente di loggarsi ad un sito con un codice laddove nel sito quel codice non ci sarà da nessuna parte solo nel database, a sto punto è solo la colpa dell'utente se qualcuno riesca a trovarne il codice,.
    Questo "codice", generalmente si chiama password.

    Quindi, cerchi nel database "WHERE codice='".$_POST['codice']."'". Ma se l'utente, nel campo "code" {che sarebbe la password}, ti scrive:

    Codice:
    supercalifragilistichespiralidoso' OR '1
    ?

    La query diventa:
    Codice:
    WHERE codice = 'supercalifragilistichespiralidoso' OR '1'
    ..e direi che il where è verificato

    ...Quindi, il mio consiglio è quelli di usare SEMPRE quella funzione, per ogni variabile passata alle query. (le stringhe "create" dal php non ce ne sarebbe bisogno, ma io a volte nell'incertezza, la uso ugualmente quella funzione!).

    Ciao!
    Ultima modifica di alemoppo : 01-09-2011 alle ore 14.59.28 Motivo: corretto supercalifragilistichespiralidoso

  9. #9
    Guest

    Predefinito

    Ma voi la notte non dormite?

  10. #10
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito

    Beh, si potevo chiamarla password il "codice", comunque sta notte ho sognato, funzionerebbe se facessi così?
    ovvero un modo "facilissimo" senza usare la funzione real_escape_string e str_replace:

    Codice PHP:
    //iniziamo dal form che è normalissimo
    <form action='' method='post'>
    <
    input type='text' name='user'>
    <
    input type='password' name='pass'>
    <
    input type='submit' name='login' value='Logga'>
    </
    form>


    if(
    $_POST['login']){
    $user=$_POST['user'];
    $pass=$_POST['pass'];
    $hash=hash('sha512' , $pass);

    //provo a fare un controllo sul valore della password e controllo se esistono uguaglianze con l'sql inject
    ii ($pass == " OR pass='1'" || $pass == ...){
    echo
    "Qui qualcuno cerca di barare";}

    else{
    //resto del codice
    ...
    }


    }
    Ultima modifica di memai : 01-09-2011 alle ore 11.23.42
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

  11. #11
    Guest

    Predefinito

    No. Non funzionerebbe.

    alemoppo non ha scritto

    Codice PHP:
    OR pass='1'
    ma

    Codice PHP:
    OR '1'
    che è cosa diversa. E poi per un'azione del genere si può usare qualsiasi espressione che sia sicuramente vera (1=1, true, ...).

  12. #12
    L'avatar di memai
    memai non è connesso Utente
    Data registrazione
    10-02-2010
    Residenza
    Bergamo
    Messaggi
    175

    Predefinito

    Lascia stare l'errore di scrittura, io non sono uno che usa l'sql injection, ergo non so se sia sbagliato o corretto, io nell'if scrivo tutti i modi per usare l'sql inject e se è presente una di questi modi, dà errore, come mai dici che non funzionerebbe? All'inizio parto facendo un controllo del valore della variabile e se questo a il valore che gli dico io succede una cosa mentre se non è quello va avanti col codice, non credo di star sbagliando
    Notte bistecca, ho l'acquolina in bocca e 'sta sera c'è, carne di manzo per me!

  13. #13
    Guest

    Predefinito

    Beh, di fonte a certezze granitiche come la tua...

    Se sei così sicuro (ed hai pure i poteri divinatori tanto da prevedere TUTTE le possibili varianti di attacco) vai avanti ...

    E poi se preferisci scrivere più e più righe di codice e decine di controlli pur di non usare una funzione ... son fatti tuoi

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

    Predefinito

    Citazione Originalmente inviato da memai Visualizza messaggio
    io nell'if scrivo tutti i modi per usare l'sql inject e se è presente una di questi modi, dà errore, come mai dici che non funzionerebbe?
    Ma lol. Tutto questo per non usare una funzione?
    Cioè, determinare tutti i casi non è poi così imediato, e tra l'altro tutti quegli if (credo) richiedano più tempo piuttosto che aggiungere un backslash prima degli apici...

    Poi, come detto da simpleticket, non solo si può mettere OR '1', ma 1 = 1, 5 = 5, 148=148, 19<20, true, 'cane' <> 'gatto' ...
    Tutti i casi, penso sia impossibile determinarli...

    Ciao!

Regole di scrittura

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