2012-04-11 10 views
6

Utilizzando PHP, qual è il modo migliore per memorizzare caratteri speciali (come i seguenti) in un database MSQUL, per evitare iniezioni.Corretto il metodo PHP per memorizzare caratteri speciali nel DB MySQL

« " ' é à ù 

Questo è come lo faccio ora:

$book_text=$_POST['book_text']; 
$book_text=htmlentities($book_text, "ENT_QUOTES"); 
$query=//DB query to insert the text 

Poi:

$query=//DB query to select the text 
$fetch=//The fetch of $book_text 
$book_text=html_entity_decode($book_text); 

In questo modo, tutto il mio testo è formattato in entità HTML. Ma penso che questo richieda molto spazio nel database. Quindi, c'è un modo migliore?

+2

utf8 è tuo amico –

+0

Il '" ENT_QUOTES "' deve essere 'ENT_QUOTES' (senza virgolette) perché è una costante predefinita PHP. E ho pensato che è possibile posizionarlo in modo raw nel DB e quando vuoi farlo eco usi 'htmlentities' –

risposta

6

Utilizzare la codifica utf8 per memorizzare questi valori.

Per evitare le iniezioni utilizzare mysql_real_escape_string() (o dichiarazioni preparate).

Per proteggere da XSS utilizzare htmlspecialchars.

+0

utf8 nelle regole di confronto del database? –

+0

utf8 come codifica delle colonne delle tabelle – Botanick

+1

non è possibile mysql_real_escape_string() non è confrontabile con le istruzioni preparate. Questa funzione è no per evitare iniezioni e non può aiutare contro di loro da solo. –

1

Sembra che la tua domanda possa essere generalizzata alla gestione e all'archiviazione di UTF8 con PHP e MySQL.

Per essere sicuri dalle iniezioni SQL, è necessario utilizzare istruzioni preparate. I driver mysqli e PDO supportano entrambi.

Le dichiarazioni preparate vengono automaticamente citate dal conducente, quindi non devi preoccuparti di questo.

Le tabelle del database devono essere create con il set di caratteri utf8 e le regole di confronto utf8_general_ci. Queste impostazioni my.cnf garantiranno il server MySQL viene eseguito UTF8 per tutto:

[mysqld] 
default-character-set=utf8 
default-collation=utf8_general_ci 
character-set-server=utf8 
collation-server=utf8_general_ci 
init-connect='SET NAMES utf8' 

[client] 
default-character-set=utf8 

essere consapevoli del fatto che PHP è generalmente inconsapevole di UTF8, così si dovrebbe aver cura di utilizzare sia iconv o mbstring librerie per la manipolazione delle stringhe. Vedi PHPWACT per una buona panoramica.

Renda set di caratteri interno sicuro di PHP è impostata su Unicode

iconv_set_encoding('internal_encoding', 'UTF-8'); 
mb_internal_encoding('UTF-8'); 

Si dovrebbe anche fare in modo il browser conosce la codifica inviando sia l'intestazione corretta o l'aggiunta di un tag <meta> per charset.

Che dovrebbe farlo.

0

La tua domanda è una bella raccolta di confusioni. Sei riuscito a confondere tutto
Proviamo a risolverlo.

Utilizzando PHP, qual è il modo migliore per memorizzare caratteri speciali (come i seguenti) in un database MSQUL, per evitare iniezioni.

Questi sono argomenti incomparabili. La memorizzazione di caratteri speciali è una questione ed evitare le iniezioni è un'altra. completamente diverso.

$book_text=htmlentities($book_text, "ENT_QUOTES"); 

questa è la parte più divertente. sebbene sia inteso a proteggere le tue query, in realtà non fa nulla. Perché invece di costante ENT_QUOTES quale valore è 3 stai usando la stringa ENT_QUOTES quale valore numerico è 0, quindi non stai impostando alcun flag.

Ma anche se si imposta questo flag correttamente, non ti proteggerà automaticamente. Perché un codice di iniezione non può contenere caratteri speciali.

Per evitare iniezioni, è necessario seguire l'intera serie , non una semplice funzione "make_my_data_safe()". Non c'è bacchetta magica.
Vedere this my answer per i dettagli.

Per quanto riguarda i caratteri speciali, è semplice. L'unico problema è che non ci sono caratteri speciali solidi impostati. Ci sono diversi caratteri speciali per i diversi ambienti.

  • 'hanno un significato per il database e HTML
  • <> hanno un significato per l'HTML solo
  • é à u ha senso solo per il codice HTML, dipende dalla codifica.

avete utilizzato diverse regole di formattazione per ogni caso. Diverso, non uno solo per tutti.

per utilizzare i caratteri in formato HTML con HTML è necessario impostare l'intestazione HTTP corretta. per usare é à ù con il database devi impostare la codifica della tabella in utf8 e la codifica della connessione in utf 8.

+0

$ book_text = htmlentities ($ book_text, "ENT_QUOTES"); è stato un errore nel postarlo qui. Sul mio file php era $ book_text = htmlentities ($ book_text, ENT_QUOTES); –

Problemi correlati