2011-01-08 7 views
9

Sono molto nuovo a PHP, in pratica sto cercando di creare un sistema di commenti per il mio sito. Ho la seguente funzione:htmlentities() e mysql_real_escape_string() sono sufficienti per pulire l'input dell'utente in PHP?

$ input = $ _POST ['commento'];

function cleanUserInput ($ input) { $ input = mysql_real_escape_string ($ input); $ input = htmlentities ($ input); return $ input; }

Quindi la domanda è, mysql_real_escape_string solo è sufficiente per impedire l'iniezione sql? e htmlentities() è sufficiente per impedire che script, html e stili inseriti dall'utente abbiano effettivi effetti e vengano semplicemente visualizzati come testo?

Oppure devo aggiungere altro alla mia funzione per rendere l'input davvero innocuo?

+0

Per staccare html, utilizzare htmlspecialchars() invece. –

risposta

2

Entrambe le funzioni do risolvono una parte importante dei problemi di sicurezza relativi a iniezioni di qualsiasi tipo e alcuni altri problemi, tuttavia, la quantità di bug di sicurezza che l'applicazione può avere è sconcertante.

Se sei un maniaco della sicurezza, allora ti troverai in gravi problemi, ma starai bene iniziando a controllare Chris Shiftlett's website, che è una delle maggiori autorità sulla sicurezza di PHP in tutto il mondo.

E, infine è possibile controllare il OWASP web, e la loro Top Ten Project, dove tengono traccia sulle minacce alla sicurezza più comuni e mantenere gli aggiornamenti su hw per combatterli,

Spero di poter essere di aiuto.

11

mysql_real_escape_string NON è sufficiente. È inoltre necessario prendere in considerazione come strutturare la query. Si consideri il seguente script di accesso semplice:

$username = mysql_real_escape_string($_GET['username']); 
$password = mysql_real_escape_string($_GET['password']); 
$sql = "SELECT * FROM users WHERE username = $username AND password = $password"; 

senza virgolette intorno $username e $password, l'iniezione è ancora possibile. (Si consideri un nome utente = test, gli utenti DROP TABLE; - Bye bye dati :(

mysql_real_escape_string è sufficiente da un punto di sanificazione SE si struttura la query correttamente Per una query ben costruito, questo funziona bene

.!..

Una domanda migliore è "cosa stai cercando di impedire?" Dovresti anche essere a conoscenza di XSS (cross-site-scripting) memorizzato e riflesso Se stai memorizzando input dagli utenti nel tuo database e che i dati sono resi nel browser, ti consigliamo di rimuovere i tag <script>.

Ci sono molti filtri e codici disponibili in linea per questo a seconda della lingua. Se utilizzi Rails o Cod eIgniter, è fatto per te.

Per quanto riguarda questo tipo di sicurezza è interessato, mi consiglia di utilizzare il seguente:

  1. scaricare e installare damn vulnerable web app.la sua un'applicazione progettata per insegnare i pro ei contro di web hacking (basato su PHP)
  2. sempre tenta di inviare caratteri di un set di caratteri diverso
  3. sempre tenta di inviare il byte NULL
  4. evitare di passare troppi parametri nella querystring (può dare via la tua struttura dei dati)
  5. guardare i registri delle
  6. scaricare burpsuite - non avrai mai guardare a un sito web allo stesso modo nuovo
  7. orologio essendo loquace. I messaggi di errore di mysql sono ottimi per il debug, ma danno via un sacco di informazioni - spesso le volte rivelano l'intera query!

linea di fondo - se proviene dall'utente, è non può fidarsi di!

+0

Grazie per il voto negativo senza commenti! :) – sethvargo

1

Se si utilizza PHP 5.2 o versione successiva, è possibile utilizzare l'igienizzazione dell'input incorporato.

Ad esempio:

$input = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);

Riferimenti:

  1. filter_input
  2. Available filters
Problemi correlati