Domanda

Io di solito utilizzare questa funzione per disinfettare i miei input del form prima di riporli nel mio database:

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

Fino ad oggi non mi rendevo conto che mysql_real_escape_string necessaria una connessione al database, come ho usato solo quando ho la pulizia dei dati prima di riporla nel database.

Ho provato ad utilizzare la funzione su un modulo di contatto ed ho ottenuto "Non è stato possibile stabilire un collegamento al server" l'errore. Ho potuto collegare alla base di dati, ma non c'è bisogno perché semplicemente sto cercando di sterilizzare i dati prima che sia stato inviato fuori alla mia e-mail tramite il modulo di contatto.

Qual è il modo migliore per i dati Disinfettare che non è di essere memorizzati in un database mysql e che questi dati devono ancora essere sterilizzate?

È stato utile?

Soluzione

uso filter_var()

http://php.net/manual/en/function.filter -var.php

come se si vuole disinfettare una e-mail:

$_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

al messaggio

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

IS enogth

Altri suggerimenti

Lo scopo della sanificazione dati con mysql_real_escape_string è quello di evitare l'iniezione SQL. Se non si utilizza SQL, sei già immuni.

Gli uomini non si ottiene il cancro cervicale.

Utilizzare una sanificazione appropriata per i caratteri speciali che è necessario evitare. Idealmente, non togliere qualcosa che non causerà danno.

L'intero concetto è sbagliato. Questa funzione non non aiuta per la posta elettronica nemmeno per il database.

Non mysql_real_escape_string nulla "disinfettare". Si tratta semplicemente di sfuggire delimitatori e nient'altro. Proprio per evitare errori di sintassi se si dispone di un delimitatore nei dati:

SELECT * FROM table WHERE name = 'it's me' # error!

dopo che i dati essere fuggiti, i dati diventano 'it\'s me' e non v'è alcun errore.
Pertanto, questa funzione è disponibile solo con query SQL e per i dati, racchiuso tra virgolette solo .

Quindi, non c'è alcun senso nel fare proprio mysql_real_escape_string senza virgolette. mysql_real_escape_string dovrebbe essere usato
a) da solo. roba come assetto o stripslashes ha nulla a che fare qui
b) a destra prima stringa di query comporre e non altrove
c) solo con i dati che andare a essere racchiuso tra virgolette.
d) tutti gli altri dati bisogno di un altro modo di sanificazione

Per quanto riguarda la posta elettronica, non è necessario alcun sanificazione che si invia come testo normale. L'unica precauzione si deve prendere è contro iniezione elettronica
Non è un grosso problema però. Basta mettere l'input dell'utente in unico corpo del messaggio. non in soggetto, da o verso o qualsiasi altra intestazione. solo corpo del messaggio. E tu sei sicuro

(Sono nuovo di StackOverflow così ho intenzione di questo nel modo sbagliato / facendo un cattivo lavoro con lo stile della mia risposta esitate a farmi sapere.)

mi corregga se sbaglio come sto curando anche lo stesso problema in questo momento, ma non credo che la risposta accettata utilizzando filter_var è sufficiente come attaccanti potrebbe aggirare questo usando unicode.

Esempio: "& # 66; & # 99; & # 99; & # 58;" (Spazi aggiunti in modo StackOverflow visualizzerà correttamente)

Ciò non ottenere rimosso dalla stringa, e in seguito sarebbe stato sostituito con "Bcc:".

Questa è la mia soluzione, ma ci può essere un modo migliore. Se qualcuno sa di uno mi piacerebbe sentirla.

    $string = str_replace("&", "(and)", $string);
    $string = str_replace("#", "(num)", $string);
    $string = str_replace(";", "(semi-colon)", $string);
    $string = str_replace(":", "(colon)", $string);
    $string = str_replace("@", "(at)", $string);
    $string = str_replace("\\", "(backslash)", $string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top