- Home
- Categorie
- Coding e Sistemistica
- PHP
- Problema inserimento
-
Sostituisci questo:
[php]$stringa_query="select provincia from citta order by provincia";
[/php]
Con:
[php] $stringa_query="select sigla,provincia from citta order by provincia";
[/php]Invece di $row_provincia[sigla] sarebbe più corretto mettere $row_provincia['sigla'] anche perchè in quel modo dovrebbe generarti un notice perchè cerca la costante sigla.
-
No, ahimè questa soluzione non porta da nessuna parte.
La tabella citta è stata importata ed è composta dai seguenti campi :
provincia
regione (vincolo di integrità referenziale con un'altra tabella regione)
siglaTutti e 3 di tipo varchar, stesso tipo e stessa lunghezza del dato impostato nella tabella utente.
Sembra tutto "lineare" invece inceppiamo in qualche stupidata...
-
Intanto verifica che nel tuo form i value siano impostati correttamente, perchè prima non lo erano sicuramente, vedi un pò ora.
-
@Thedarkita said:
Sostituisci questo:
[php]$stringa_query="select provincia from citta order by provincia";
[/php]Con:
[php] $stringa_query="select sigla,provincia from citta order by provincia";
[/php]Invece di $row_provincia[sigla] sarebbe più corretto mettere $row_provincia['sigla'] anche perchè in quel modo dovrebbe generarti un notice perchè cerca la costante sigla.Se intendi questi value ho gia modificato tutto dal precedente intervento prima di dire che non funzionava neanche dopo quell'accorgimento!
-
No intendo i value delle option del select del tuo form.
-
Queste son le option value del form dove ho la mia combobox
$stringa_query="select sigla,provincia from citta order by provincia"; $elenco_provincia=mysql_query($stringa_query) or die(mysql_error()); while($row_provincia=mysql_fetch_array($elenco_provincia)){ $sigla_procincia=$row_provincia['sigla']; $nome_provincia=$row_provincia['provincia']; echo "<option value=\"$sigla_provincia\">$nome_provincia</option>\n";
Dovrebbero andar bene adesso!
-
Prima hai scritto
[php]$sigla_procincia=$row_provincia[sigla];[/php]e poi
[php]$sigla_provincia[/php];)A parte questo devo dire che il tuo codice ha dei seri problemi, primo fra tutti il mancato controllo dell'input utente: fai una query insert inserendo direttamente i valori che l'utente ti passa tramite $_POST - PERICOLOSISSIMO!! Mai sentito parlare di SQL injection? http://it.wikipedia.org/wiki/SQL_injection
-
Azz...ho letto almeno 20 volte i nomi...diventerei un pazzo quando succedono ste cose.Ti ringrazio per l'accorgimento!
SQL Injection...ne avevo letto qualcosa a riguardo qualche tempo fa.
Onestamente non saprei che genere di controlli poter mettere nei vari campi poichè son proprio alle primissime armi con il php (penso che si veda anceh dal tipo di codice postato).
Qualche consiglio me lo potresti dare?Ho letto che possono inserire delle queries nelle varie textbox e da li autenticarsi...
Ti spiego di che tratta il sito : è un sito di annunci, nel quale ti registri e pubblichi qualcosa...una sorta di esperimento più che altro. Per pubblicare un annuncio devi semplicemente registrarti, all'iscrizione ti verrà inviato un codice che dovrai mettere in una textbox di controllo per pubblicare l'annuncio..diciamo che è una sorta di base, un esperimento per provare un futuro progetto!
Pertanto non dispongo di casella login/logoutMi chiedo pertanto...La SqlInjection si fa nelle caselle login oppure può essere fatta anche in textbox varie che "elabori" per poi mandare i dati in un database ???
Se la risposta è affermativa, ahimè credo che lo sia, che mi consigli per difendermi allora ?
-
Come avrai letto dalla pagina di Wikipedia, la SQL Injection vuol dire che un utente utilizza una vulnerabilità del tuo codice per far eseguire dei comandi SQL non previsti da te al tuo database.
Essere vulnerabili vuol dire, in primo luogo, fare come fai tu, cioè non controllare e non "bonificare" l'input dell'utente: nella tua query tu inserisci direttamente il contenuto dell'array $_POST - passi quindi direttamente al db del testo inserito dall'utente, senza controllare che non contenga codice malevolo e senza assicurarti che non possa fare del "male". Ovviamente non c'entra nulla se questo testo inserito dall'utente venga da una textarea, da una casella di login o da qualunque altro input utente
Per "difendersi" ti consiglio:
- in primo luogo di "studiare" un po' di più, ci sono tanti e tanti articoli su questo argomento
- la soluzione ideale sarebbe utilizzare una libreria per parlare con il tuo DB e non le funzioni MySQL di PHP (nello specifico, la libreria da utilizzare dovrebbe essere MDB2 che trovi su PEAR) e sfruttare i sistemi già inclusi per evitare i rischi di SQL Injection (tipo l'utilizzo dei placeholder)
- se proprio non vuoi fare tutto ciò, almeno utilizza mysql_real_escape_string prima di inserire l'input dell'utente dentro una qualsiasi query
HTH, ciao!
-
Ho dato un occhiata in giro nel poco tempo che ho per dedicarmi a questo sito ed ho trovato una sorta di funzione che dicono che sia efficace.
Onestamente prima di utilizzarla preferirei ascoltare un tuo parere perchè mi sembri una persona più che preparata e dalla quale si può apprendere molto:<?php function pulisci( $value ) { if( get_magic_quotes_gpc() ) $value = stripslashes( $value ); if( is_numeric( $value ) ) return $value; $value = addslashes( htmlspecialchars( $value ) ); return $value; } foreach( $_POST as $key => $val ) { $_POST[$key] = pulisci( $val ); } foreach( $_GET as $key => $val ) { $_GET[$key] = pulisci( $val ); } ?>
Penso che vada richiamata in ogni textbox nella quale un utente malevolo possa immettere del codice!!!
Che ne pensi?
-
No, la funzione che devi usare (se usi MySQL, come mi pare tu faccia) è mysql_real_escape_string - e la usi solo nella query quando ne hai bisogno.
Ad esempio:
[php]$query = "INSERT INTO utente
(tipo_utente, nome, cognome, ...)
VALUES (
'" . mysql_real_escape_string($tipo_utente) . "', '" . mysql_real_escape_string($nome) . "', '" . mysql_real_escape_string($cognome) . "', ...)";[/php]
HTH, ciao!
-
Perfetto. Grazie mille per la dritta...
Stavo vedendo, tanto sapere anche qualcosa in più, la funziona addslashes() o in alternativa a quella che hai detto tu mysql_real_escape_string la funzione mysql_escape_string.
Comunque penso proprio che userò questa che mi hai appena consigliato.
Solo una curiosità a questo punto : perchè quando usi la funzione che mi hai consigliato
aggiungi dei punti subito dopo l'apetura dei doppi apici e subito priam della chiusura?
hanno qualche funzione particolare questi punti ?Grazie ancora per l'aiuto.
Gentilissimi in questo forum come pochi altri...
Spero un giorno di poter essere utile alla community anche io come
lo siete stati voi con me!
-
Ah dimenticavo una cosa da chidere nel post precedente.
Il controllo sui dati immessi del tipo anteporre alla variabile il tipo di dato per esempio :$eta=(int)$_POST($eta);
è necesasrio?
Oppure con la funzione mysql_real_escape_string($eta) sono apposto e non ho bisogno di altri controlli ???
-
addslashes ``` è una funzione (di fatto) deprecata per gli inserimenti nel DB, ``` mysql_escape_string ``` è uguale a ``` mysql_real_escape_string ``` solo che non rispetta il character set... I punti servono per poter concatenare funzioni e stringhe: non puoi inserire una funzione all'interno di virgolette, cioè non puoi fare [php]"INSERT INTO table ( campo1, campo2 ) VALUES ( mysql_real_escape_string($valore1), mysql_real_escape_string($valore2) )"[/php]quindi devi "spezzare" la stringa fra virgolette facendo [php]"INSERT INTO table ( campo1, campo2 ) VALUES ( " . mysql_real_escape_string($valore1) . ", " . mysql_real_escape_string($valore2) . " )"[/php] Spero di essere stato chiaro anche se questo punto spesso non è facile da comprendere...
-
Risposta veloce: può bastare mysql_real_escape_string.
In ogni caso io farei [PHP]$eta = intval($_POST($eta));[/PHP] (non so se è meglio ma mi piace di più
Oh, un'altra cosa: fino ad adesso stiamo parlando di sicurezza del dato (cioè evitiamo che un "hacker" ci distrugga o rubi i dati) - altro discorso è l'integrità del dato, cioè i controlli che dobbiamo fare per assicurarci che i nostri dati abbiano "senso", ad esempio che l'utente non inserisca il 30 febbraio come data o "abc" come età...
-
Ok perfetto...
Ti ringrazio di tutto, abbiamo parlato un po di tutto in questo thread ed ho imparato molte cose grazie a voi !!Grazie a presto!