Htmlentities vs addslashes vs mysqli_real_escape_string
J'ai fait un peu de lecture sur la sécurisation des applications PHP, et il me semble que mysqli_real_escape_string
est la bonne fonction à utiliser lors de l'insertion de données dans des tables MySQL car addslashes
peut provoquer certaines des choses étranges pour une smart attaquant. Droit?
Cependant, il y a une chose qui est source de confusion pour moi. Il me semble me rappeler d'être conseillé addslashes
est mieux que htmlentities
lors de l'écho des données saisies par l'utilisateur en arrière pour les utilisateurs à protéger leurs données, mais il semble que addslashes
est celle de la vulnérabilité. Est-ce vrai, ou suis-je en se souvenant de façon incorrecte?
Vous devez vous connecter pour publier un commentaire.
Il y a différents contextes de vos données. Le contexte de l'insertion de données dans la base de données doit être échappé différemment que dans le contexte de rendu html/xml ou même d'un message électronique.
Échapper les données dans une base de données devrait être déconseillé dans tous les nouveaux code en faveur des requêtes préparées. Quelqu'un qui vous dit le contraire est en train de faire un très mauvais service.
Échapper données, le navigateur doit être échappé dans un certain nombre de façons différentes en fonction de la cible. Parfois htmlspecialchars suffit, parfois, vous avez besoin d'utiliser htmlentities. Parfois, vous avez besoin entités numériques. C'est un sujet que vous devriez faire quelques recherches pour connaître toutes les nuances.
La règle générale je vis ici est de valider (pas de filtre, de le rejeter si elle est incorrecte) entrée & échapper à la sortie (selon le contexte).
Ils sont différents outils à des fins différentes.
mysqli_real_escape_string fait de la sécurité des données pour l'insertion dans MySQL (mais paramétrées, les requêtes sont de mieux en mieux).
Htmlentities fait de la sécurité des données de sortie dans un document HTML
addslashes rend de données de sécurité pour quelques autres situations, mais il est insuffisant pour MySQL
Vous pouvez également utiliser la AOP libs qui n'a plus de s'échapper pour vous, dans le cas où vous pouvez utiliser PHP5 sur les serveurs.
Sur l'écho de retour je ne préfère personnellement htmlspecialchars, mais on peut me corriger
oui, utiliser le mysqli_real_escape_string ou une bibliothèque comme AOP sur toutes les entrées de l'utilisateur. Lors de l'écho de retour, j'utilise htmlentities avec ENT_QUOTES comme deuxième paramètre, comme il échappe à toutes les lois applicables sur les caractères en entités html, y compris des citations.
Remarque: l'Utilisation de htmlentities() dans une codé en UTF-8 document doit être évitée. Voir:
Prêter attention à (cité de phpwact.org):
htmlentities()
n'est pas rendu "bizarre" des personnages, mais plutôt d'éviter potentiellement dangereux de texte pour être analysée comme le balisage, et cela n'a rien à voir avec le codage.Une autre solution intéressante pour PHP 5.2 et ci-dessus est d'utiliser l'extension de filtre: http://www.php.net/manual/en/book.filter.php
Elle vous permet de valider et de désinfecter les entrées de l'utilisateur. Il existe de nombreux filtres intégrés disponibles et ils peuvent être combinés avec des drapeaux à modifier leurs comportements.
En outre, ces filtres peuvent également être utilisés pour valider/désinfecter ints, des flotteurs, des e-mails, spécifique des expressions régulières.
Personnellement, j'ai commencé à les utiliser dans mes projets à valider des formulaires et des données saisies par l'utilisateur, et je suis très heureux que j'ai fait. Bien que, quand j'ai insérer des valeurs dans une base de données MySQL, j'utilise les requêtes préparées pour plus de sécurité. Ces solutions, ensemble, peuvent aider à éviter la plupart des injections SQL et XSS-type d'attaques.
Vous ne pouvez pas avoir une "fuite" de la fonction et espérer qu'il fonctionne tout le temps. Il y a différentes attaques qui ont besoin de l'assainissement des routines. La seule façon de comprendre ce concept consiste à écrire du code vulnérable et ensuite l'exploiter. L'écriture d'un code d'exploitation est essentielle à la compréhension de tout système de sécurité.
Par exemple, cette requête est vulnérable à l'injection Sql:
Exploiter:
http://localhost/sqli_test.php?host=\&nom=%20sleep(20)--%201
La meilleure fonction d'échappement pour mysql est mysqli_real_escape_string (), mais cela peut échouer:
exploiter:
http://localhost/sqli_test.php?id=1%20or%20sleep(20)
En fait, la meilleure façon de prendre soin de l'injection sql n'est pas l'appel d'une fonction d'échappement, à l'aide de Son ADODB est paramétrées, cahiers pour l'injection sql. Utilisation htmlspecialcahrs($var,ENT_QUTOES) pour les XSS. Lire la Top 10 OWASP car il est beaucoup plus que ce qui peut aller mal avec la sécurité des applications web.