Alternativa a mysql_real_escape_string senza connessione al DB

Mi piacerebbe avere una function che si comport come mysql_real_escape_string senza connettersi al database poiché a volte ho bisogno di eseguire test a secco senza connessione DB. mysql_escape_string è deprecato e quindi non è desiderabile. Alcuni dei miei risultati:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

È imansible uscire in sicurezza da una string senza una connessione DB. mysql_real_escape_string() e le istruzioni preparate richiedono una connessione al database in modo che possano sfuggire alla string utilizzando il set di caratteri appropriato, altrimenti gli attacchi di SQL injection sono ancora possibili utilizzando caratteri multibyte.

Se si sta solo testando , si può anche usare mysql_escape_string() , non è garantito al 100% contro gli attacchi SQL injection, ma è imansible creare qualcosa di più sicuro senza una connessione DB.

Bene, secondo la pagina di riferimento della function mysql_real_escape_string : "mysql_real_escape_string () chiama la function di libreria MySQL mysql_real_escape_string, che sfugge ai seguenti caratteri: \ x00, \ n, \ r, \, '," e \ x1a. "

Con questo in mente, la function indicata nel secondo link che hai pubblicato dovrebbe fare esattamente ciò di cui hai bisogno:

 function mres($value) { $search = arrays("\\", "\x00", "\n", "\r", "'", '"', "\x1a"); $replace = arrays("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z"); return str_replace($search, $replace, $value); } 

In diretta opposizione alla mia altra risposta, questa seguente function è probabilmente sicura, anche con caratteri multi-byte.

 // replace any non-ascii character with its hex code. function escape($value) { $return = ''; for($i = 0; $i < strlen($value); ++$i) { $char = $value[$i]; $ord = ord($char); if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) $return .= $char; else $return .= '\\x' . dechex($ord); } return $return; } 

Spero che qualcuno più esperto di me possa dirmi perché il codice sopra non functionrà …

Da ulteriori ricerche, ho trovato:

http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html

Correzione di sicurezza:

Un buco di sicurezza con iniezione SQL è stato trovato nell'elaborazione della codifica multibyte. Il bug era nel server, analizzando erroneamente la string con la function API C mysql_real_escape_string ().

Questa vulnerabilità è stata scoperta e riportta da Josh Berkus e Tom Lane come parte della collaborazione di sicurezza tra i progetti del consorzio OSDB. Per ulteriori informazioni sull'iniezione SQL, vedere il seguente text.

Discussione. Un buco di sicurezza di iniezione SQL è stato trovato nell'elaborazione della codifica multi-byte. Un buco di sicurezza di SQL injection può includere una situazione in cui quando un utente ha fornito dati da inserire in un database, l'utente può inserire istruzioni SQL nei dati che il server eseguirà. Riguardo a questa vulnerabilità, quando viene utilizzata l'escape di carattere set-aware (ad esempio, addslashes () in PHP), è ansible ignorare l'escaping in alcuni set di caratteri multibyte (ad esempio SJIS, BIG5 e GBK). Di conseguenza, una function come addslashes () non è in grado di prevenire attacchi di SQL injection. È imansible risolvere questo problema dal lato server. La soluzione migliore è che le applicazioni utilizzino l'escaping basato su caratteri set-aware offerto da una function come mysql_real_escape_string ().

Tuttavia, è stato rilevato un errore nel modo in cui il server MySQL analizza l'output di mysql_real_escape_string (). Di conseguenza, anche quando è stata utilizzata la function di rilevamento dei caratteri mysql_real_escape_string (), è stato ansible eseguire l'iniezione SQL. Questo errore è stato corretto.

Soluzioni alternative. Se non è ansible aggiornare MySQL a una versione che include la correzione per il bug nell'analisi di mysql_real_escape_string (), ma eseguire MySQL 5.0.1 o versione successiva, è ansible utilizzare la modalità SQL NO_BACKSLASH_ESCAPES come soluzione alternativa. (Questa modalità è stata introdotta in MySQL 5.0.1.) NO_BACKSLASH_ESCAPES triggers una modalità di compatibilità standard SQL, in cui la barra rovesciata non è considerata un carattere speciale. Il risultato sarà che le query falliranno.

Per impostare questa modalità per la connessione corrente, immettere la seguente istruzione SQL:

 SET sql_mode='NO_BACKSLASH_ESCAPES'; 

Puoi anche impostare la modalità a livello globale per tutti i client:

 SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES'; 

Questa modalità SQL può anche essere abilitata automaticamente all'avvio del server utilizzando l'opzione della row di command –sql-mode = NO_BACKSLASH_ESCAPES o impostando sql-mode = NO_BACKSLASH_ESCAPES nel file delle opzioni del server (ad esempio my.cnf o my.ini , a seconda del tuo sistema). (Bug # 8378, CVE-2006-2753)

Vedi anche Bug # 8303.