5 suggerimenti utili per la creazione di applicazioni PHP sicure

PHP è uno dei linguaggi di programmazione più popolari per il web. A volte un linguaggio di facile utilizzo può aiutare troppo il programmatore e possono insinuarsi falle nella sicurezza, creando roadblock nel percorso di sviluppo. In questo tutorial, daremo un'occhiata a 5 suggerimenti per aiutarti a evitare alcune trappole di sicurezza PHP comuni e problemi di sviluppo.

Suggerimento 1: utilizzare la segnalazione degli errori corretta

Durante il processo di sviluppo, la segnalazione degli errori dell'applicazione è tua
migliore amico. Le segnalazioni di errori possono aiutarti a trovare errori di ortografia nel tuo
variabili, rilevare l'utilizzo errato delle funzioni e molto altro. Tuttavia, una volta
il sito va in diretta lo stesso rapporto che è stato un alleato durante
lo sviluppo può trasformare il traditore e dire agli utenti molto di più del tuo
sito che potresti desiderare di conoscere (il software che esegui, la tua cartella)
struttura, ecc.).

Una volta che il tuo sito è attivo, dovresti assicurarti di nascondere tutti gli errori
segnalazione. Questo può essere fatto invocando la seguente semplice funzione
nella parte superiore dei file dell'applicazione.

error_reporting (0);

Se qualcosa va storto, vuoi ancora e devi saperlo
esso. Pertanto, dovresti sempre assicurarti di registrare i tuoi errori su a
file protetto. Questo può essere fatto con la funzione PHP set_error_handler.

Suggerimento 2: disabilitare le "Funzionalità errate" di PHP

Fin dai suoi primi giorni, i designer di PHP ne hanno sempre incluso alcuni
caratteristiche per facilitare lo sviluppo. O così pensavano! Alcuni di questi
funzioni utili possono avere conseguenze non volute. Io chiamo questi "cattivi"
caratteristiche "perché hanno permesso incubi di validazione dei dati e
creato un percorso per i bug per trovare la loro strada negli script. Uno di
le prime cose che dovresti fare quando inizia il processo di sviluppo è
disabilitare alcune di queste funzionalità.

Nota: a seconda dell'host, è possibile o meno disattivarlo
tu. Se stai sviluppando sul tuo computer o su un altro locale simile
ambiente, probabilmente non verranno disattivati. Alcune di queste funzionalità
sono stati rimossi anche nel prossimo PHP6, ma sono onnipresenti in PHP4
applicazioni e sono deprecate solo in applicazioni PHP5.

Register Globals (register_globals)

In breve, register_globals aveva lo scopo di aiutare la rapida applicazione
sviluppo. Prendi ad esempio questo URL,
http: //yoursite.tld/index.php? var = 1, che include una stringa di query. Il
L'istruzione register_globals ci consente di accedere al valore con $ var
invece di $ _GET ['var'] automaticamente. Questo potrebbe sembrarti utile,
ma sfortunatamente tutte le variabili nel codice ora hanno questa proprietà, e
ora possiamo facilmente entrare in applicazioni PHP che non proteggono
questa conseguenza non intenzionale. Il seguente frammento di codice è solo uno
esempio comune che vedrai negli script PHP:

if (! empty ($ _POST ['username']) && $ _POST ['username'] == 'test' &&! empty ($ _POST ['password']) && $ _POST ['password'] == "test123 ") $ access = true; 

Se l'applicazione è in esecuzione con register_globals su ON, un utente potrebbe
basta inserire access = 1 in una stringa di query e quindi avere accesso a
qualunque sia lo script in esecuzione.

Sfortunatamente, non possiamo disabilitare register_globals dallo script
lato (usando ini_set, come normalmente possiamo), ma possiamo usare un
.file htaccess per fare questo. Alcuni host ti consentono anche di avere un php.ini
file sul server.

Disabilitare con .htaccess

php_flag register_globals 0

Disabilitare con php.ini

register_globals = Off

Nota: se si utilizza un file php.ini personalizzato non applicabile a
intero server, è necessario includere queste dichiarazioni in ogni sottocartella
che ha PHP.

Quotes magiche (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)

Magic Quotes era una funzione pensata per salvare i programmatori nei guai
usando addslashes () e altre funzionalità di sicurezza simili nel loro codice.
Ci sono almeno tre problemi associati alle citazioni magiche. Uno
problema con questa funzione utile è se entrambe le citazioni magiche e
addslashes () sono usati. Se questo è il caso, allora si finisce con
più barre aggiunte, causando errori. Il secondo problema è se
fai in modo che le citazioni magiche di assunzione siano attivate e in effetti lo sono
non. Quindi tutti gli input vengono deselezionati. Il terzo problema è questa magia
le virgolette escono solo virgolette singole e doppie, ma se si utilizza a
motore di database, ci sono anche molti caratteri specifici del database
anche bisogno di essere sfuggito. Si raccomanda di disabilitarla
funzione e utilizzare invece la convalida variabile corretta (vedi sotto).

Sfortunatamente, non possiamo disabilitare le virgolette magiche dallo script
lato usando ini_set. Come con register_globals, possiamo usare .htaccess o
file php.ini per fare questo.

Disabilitare con .htaccess

php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0

Disabilitare con php.ini

magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off 

Nota: se si utilizza un file php.ini personalizzato non applicabile a
intero server, è necessario includere queste dichiarazioni in ogni sottocartella
che ha PHP.

Suggerimento 3: convalida l'input

Oltre a sfuggire personaggi, un altro ottimo modo per proteggere
l'input è di convalidarlo. Con molte applicazioni, in realtà già
sapere che tipo di dati ti aspetti in ingresso. Quindi il modo più semplice
per proteggersi dagli attacchi è assicurarsi che i propri utenti possano solo
inserire i dati appropriati.

Ad esempio, supponiamo di creare un'applicazione che elenchi gli utenti
compleanni e consente agli utenti di aggiungere il proprio. Lo vorremmo
accetta un mese come cifra tra 1 e 12, un giorno tra l'1 e il 31 e un anno
nel formato di YYYY.

Avere questo tipo di logica nella tua applicazione è semplice e regolare
le espressioni (regex) sono il modo perfetto per gestire la convalida dell'input.
Prendi il seguente esempio:

if (! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['month'])) // gestisce errore if (! preg_match ("/ ^ [0-9] 1,2 $ / ", $ _GET ['day'])) // handle error if (! Preg_match (" / ^ [0-9] 4 $ / ", $ _GET ['anno' ])) // handle error

In questo esempio, abbiamo semplicemente controllato (nelle prime due istruzioni if)
per interi [0-9] con una lunghezza di uno o due 1,2 e abbiamo fatto il
lo stesso nella terza istruzione if, ma controllato per una lunghezza rigorosa di 4
personaggi 4.

In tutti i casi, se i dati non corrispondono al formato che vogliamo, noi
restituire qualche tipo di errore. Questo tipo di convalida lascia molto poco
spazio per qualsiasi tipo di attacco SQL.

Le espressioni Regex come quelle sopra possono essere un po 'difficili da fare
in un primo momento, ma la loro spiegazione è fuori dallo scopo di questo
articolo. Il manuale php ha alcune risorse aggiuntive per aiutarti con la convalida. Il database PEAR ha anche alcuni pacchetti come il pacchetto Validate per aiutare con e-mail, date e URL.

Di seguito è riportato un esempio dello script precedente in azione che utilizza 200 come input per un mese, abc per il giorno e solo 09 per l'anno.

Suggerimento 4: Guarda gli attacchi XSS (Cross Site Scripting) nell'input dell'utente

Un'applicazione web di solito accetta input dagli utenti e li visualizza
in qualche modo. Questo può, naturalmente, essere in una grande varietà di forme
inclusi commenti, discussioni o post di blog sotto forma di HTML
codice. Quando si accetta l'input, consentire l'HTML può essere una cosa pericolosa,
perché ciò consente di eseguire JavaScript in modi non previsti.
Se rimane aperto anche un solo foro, JavasScript può essere eseguito e i cookie
potrebbe essere dirottato Questi dati sui cookie potrebbero quindi essere utilizzati per simulare un vero
account e dare a un utente illegale l'accesso ai dati del sito web.

Esistono alcuni modi per proteggersi da tali attacchi. Uno
il modo è di disabilitare del tutto l'HTML, perché quindi non è possibile
modo per consentire l'esecuzione di qualsiasi JavaScript. Tuttavia, se lo fai allora
anche la formattazione non è consentita, che non è sempre un'opzione per il forum
e software per blog.

Se vuoi che l'HTML sia disabilitato per lo più, ma vuoi comunque consentire l'accesso semplice
formattazione, è possibile consentire solo alcuni tag HTML selezionati (senza
attributi) come o . O, in alternativa,
puoi consentire un popolare set di tag chiamati "BBCode" o "BB Tags"
comunemente visto nei forum nel formato di [b] test [/ b]. Questo può essere un
modo perfetto per consentire la personalizzazione della formattazione mentre non autorizza
qualcosa di pericoloso. Puoi implementare BBCode usando preesistenti
pacchetti come HTML_BBCodeParser o scrivi la tua implementazione di BBCode con espressioni regolari e una serie di dichiarazioni preg_replace.

Suggerimento 5: protezione dall'iniezione SQL

Ultimo, ma non meno importante, è uno degli attacchi di sicurezza più noti
sul web: SQL injection. Gli attacchi di SQL injection si verificano quando i dati vanno
deselezionata e l'applicazione non sfugge ai caratteri utilizzati in SQL
stringhe come virgolette singole (') o doppie virgolette (").

Se questi caratteri non vengono filtrati, gli utenti possono sfruttare il sistema rendendo le query sempre vere e consentendo loro di ingannare i sistemi di accesso.

Fortunatamente, PHP offre alcuni strumenti per proteggere il tuo database
ingresso. Quando sei connesso a un server SQL puoi usarli
funziona con una semplice chiamata e le tue variabili dovrebbero essere sicure da usare
nelle domande. La maggior parte dei principali sistemi di database offerti con PHP include
queste funzioni di protezione.

MySQLi ti permette di farlo in due modi. O con la funzione mysqli_real_escape_string quando connesso a un server:

$ username = mysqli_real_escape_string ($ GET ['username']); mysql_query ("SELECT * FROM tbl_members WHERE username = '". $ username. "'");

O con dichiarazioni preparate.

Le istruzioni preparate sono un metodo per separare la logica SQL dai dati che gli vengono passati. Le funzioni utilizzate nella libreria MySQLi filtrano il nostro input per noi quando leghiamo le variabili all'istruzione preparata. Questo può essere usato in questo modo (se connesso a un server):

 $ id = $ _GET ['id']; $ statement = $ connection-> prepare ("SELECT * FROM tbl_members WHERE id =?"); $ statement-> bind_param ("i", $ id); $ Statement-> execute ();

Una cosa da notare quando si usano le istruzioni preparate è la "i" in bind_param. io sono l'acronimo di integer ma puoi usare s per string, d per double e b per blob a seconda di quali dati stiamo passando.

Anche se questo ti proteggerà nella maggior parte dei casi, dovresti
ricordate ancora la corretta convalida dei dati come menzionato in precedenza.

Chiusura

Questo breve tutorial può solo scalfire la superficie della sicurezza web.
In definitiva, spetta agli sviluppatori assicurarsi che le applicazioni siano loro
costruire è sicuro educando se stessi sui pericoli del web e
i tipi più comuni di vulnerabilità e attacchi. Se lo desideri
leggi di più sui problemi di sicurezza in PHP, c'è una sezione sulla sicurezza nel manuale php a loro dedicato.

Quali sono i tuoi consigli?

  • Iscriviti al feed RSS di NETTUTS per ulteriori tuts e articoli di sviluppo web giornalieri.