Per essere terribilmente onesto, questa funzione è solo una raccolta arbitraria di procedure più o meno inutili o dannose e talvolta persino contraddittorie, la maggior parte delle quali non ha nulla a che fare con la sicurezza. Ora per la parte più importante.
SQL Injection
For prevent my website from sql injection i always use $db->real_esacpe_string()
Che cosa stai sbagliando? Non sei solo però, lo elenco come la illusione più infame del PHP . Citando da quella pagina:
this function has absolutely nothing to do with safety or injections, merely escaping special characters in SQL string literals, making them immune to SQL injection as a side effect, but being utterly useless for any other query part, from a table name to a numeric literal. To protect from SQL injection, one should follow two simple rules:
- Any variable data literal (i.e. a string or a number) should be substituted with a parameter, whereas actual value should be sent to the query separately, through bind/execute process.
- All other query parts that happen to be added through a variable, should be explicitly filtered through a hardcoded list of allowed values.
Dato il mysqli non elaborato è piuttosto difficile con le istruzioni preparate, suggerirei di utilizzare il PDO.
Quindi l'idea principale che nulla di correlato alla sicurezza SQL dovrebbe essere in tale funzione.
XSS
Vediamo cosa stai facendo con% dannoso <
e >
caratteri:
- prima, tutti i tag vengono rimossi da
strip_tags($text);
- quindi questi simboli (già estinti dal testo) vengono sostituiti con una stringa vuota
- finalmente quei personaggi inesistenti vengono convertiti in entità HTML
Se mi chiedi di definire "overkill" ti mostrerò semplicemente questa funzione. htmlspecialchars()
da solo dovrebbe essere sufficiente per prevenire l'XSS nel corpo della pagina.
Ciò che è più importante, sembra che tu stia usando questa funzione sull'input di dati che è sbagliato. Un testo deve essere formattato subito prima dell'output, in base alle regole di formattazione per il determinato supporto. Se stai eseguendo l'output nel corpo della pagina HTML, sarebbe htmlspecialchars
. Il testo va in JavaScript, quindi dovrebbe essere un'altra formattazione e così via.
Materiale inutile
-
trim()
non ha nulla a che fare con la sicurezza, è possibile utilizzare questa funzione per comodità.
- su una nota a margine, non utilizzare mai nemmeno questo operatore
@
. È dannoso per la tua esperienza di programmazione.
-
stripslashes()
pure, non ha nulla a che fare con la sicurezza. Inoltre, questa funzione è solo inutile, non fa mai nulla di sensato.
- Per non parlare del fatto che
get_magic_quotes_gpc()
è due volte inutile, restituendo un valore che è stato rimosso da PHP 10 anni fa.
Conclusione
- sbarazzarsi di questa funzione
- per evitare che SQL injection segua 2 regole dall'alto
- per impedire che XSS utilizzi
htmlspecialchars
durante l'output dei dati o qualsiasi altra formattazione appropriata.