2010-08-09 10 views
7

Io di solito uso questa funzione per sanificare i miei input del form prima di riporli nel mio database:Sanitize modulo di contatto senza mysql_real_escape_string

//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 solo usato quando ho pulito i dati prima di memorizzarli nel database.

Ho provato a utilizzare la funzione su un modulo di contatto e ho ottenuto l'errore "Impossibile stabilire un collegamento al server". Potrei connettermi al database ma non ce n'è bisogno perché sto semplicemente cercando di disinfettare i dati prima che vengano inviati alla mia e-mail tramite il modulo di contatto.

Qual è il modo migliore per disinfettare i dati che non vengono memorizzati in un database mysql e questi dati devono ancora essere disinfettati?

risposta

15

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); 

è enogth

+0

Quali filtri specifici intendi, per favore? ce ne sono così tante –

1

Lo scopo di disinfettare i dati con mysql_real_escape_string è evitare l'iniezione SQL. Se non stai usando SQL, sei già immune.

Gli uomini non hanno il cancro cervicale.

Utilizzare una funzione di disinfezione appropriata per i caratteri speciali che è necessario evitare. Idealmente, non spogliare qualcosa che non causerà danni.

+0

mysql_real_escape_string da solo non aiutano nulla –

-1

L'intero concetto è sbagliato. Questa funzione non è di aiuto per e-mail nemmeno per il database.

mysql_real_escape_string non "disinfettano" nulla. È semplicemente delimitatori di fuga 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 funziona solo con query SQL e dati, racchiusi tra virgolette solo.

Quindi, non ha senso fare solo mysql_real_escape_string senza avere virgolette. mysql_real_escape_string dovrebbe essere usato
a) da solo. cose come trim o stripslash non hanno nulla da fare qui
b) proprio prima di comporre stringhe di query e non altrove
c) solo con dati che verranno racchiusi tra virgolette.
d) tutti gli altri dati necessitano di altri metodi di sanificazione

Per quanto riguarda l'e-mail, non è necessaria alcuna sanitizzazione, ma lo si invia come testo normale. L'unica precauzione da prendere è contro mail injection
Non è un grosso problema però. Basta inserire l'input dell'utente solo nel corpo del messaggio. non in soggetto, da o da qualsiasi altra intestazione. Solo corpo del messaggio. E tu sei sicuro

+0

Cosa? Usa sempre servizi igienico-sanitari. Non fidarti mai dell'input dell'utente. Tale consiglio presuppone che a) non ci sia modo di iniettare un'intestazione diversa nello script (se non stai disinfettando l'input, come lo sai per certo?) Eb) che tutti i client di posta faranno la cosa giusta anche con un testo/intestazione semplice. Ne dubito seriamente. – Cfreak

+0

@Cfreak l'unico punto ragionevole qui riguarda alcuni client di posta dispari. Ne hai uno come esempio? Ma tu "non ti fidi mai di input da parte dell'utente" la preghiera senza cervello è davvero divertente. Perché non fare esperienza prima di giudicare gli altri? –

-1

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

Correggetemi se ho torto visto che sto affrontando lo stesso problema in questo momento, ma non penso che la risposta accettata usando filter_var sia sufficiente perché gli hacker potrebbero aggirare questo usando l'unicode.

Esempio: "& # 66; & # 99; & # 99; & # 58;" (spazi aggiunti in modo che StackOverflow lo visualizzi correttamente)

Questo non sarebbe stato rimosso dalla stringa e sarebbe stato successivamente sostituito con "Ccn:".

Questa è la mia soluzione, ma potrebbe esserci un modo migliore. Se qualcuno ne conosce uno mi piacerebbe ascoltarlo.

$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);