Quelles sont les meilleures fonctions D'assainissement des entrées PHP?

j'essaie de trouver une fonction que je peux passer toutes mes ficelles pour assainir. Pour que la chaîne qui en sort soit sûre pour l'insertion dans la base de données. Mais il y a tellement de fonctions de filtrage là-bas, Je ne suis pas sûr de ceux que je devrais utiliser/besoin.

s'il vous Plaît aidez-moi de remplir les blancs:

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}
140
demandé sur Carlos Abraham 2010-06-27 05:39:24

9 réponses

Stop!

vous faites une erreur. Oh, non, vous avez choisi les bonnes fonctions PHP pour rendre vos données un peu plus sûres. C'est très bien. Votre erreur est dans le ordre des opérations , et où et comment utiliser ces fonctions.

il est important de comprendre la différence entre nettoyer et valider les données de l'utilisateur, échapper aux données pour le stockage, et échapper aux données pour la présentation.

La désinfection et la Validation des Données de l'Utilisateur

Lorsque les utilisateurs soumettent des données, vous devez vous assurer qu'ils ont prévu quelque chose que vous attendez.

assainissement et filtrage

par exemple, si vous attendez un numéro, assurez-vous que les données soumises est un numéro . Vous pouvez également cast "données d'utilisateur 1519220920" dans d'autres types. Tout soumis est d'abord traité comme une chaîne, afin de forcer les données numériques connues en étant un entier ou un flotteur rend la désinfection rapide et indolore.

Qu'en est-il des champs de texte libres et des textareas? Vous devez vous assurer qu'il n'y a rien d'étonnant dans ces domaines. Principalement, Vous devez vous assurer que les champs qui ne devraient pas avoir de contenu HTML ne contiennent pas réellement HTML. Il y a deux façons dont vous pouvez faire face à ce problème.

tout d'abord, vous pouvez essayer échapper entrée HTML avec htmlspecialchars . Vous ne devez pas utiliser htmlentities pour neutraliser HTML, car il effectuera également l'encodage des caractères accentués et d'autres qu'il pense également avoir besoin d'être encodé.

Deuxièmement, vous pouvez essayer supprimer tout HTML possible. strip_tags est rapide et facile, mais aussi bâclé. Purificateur HTML fait un travail beaucoup plus complet des deux enlever tout HTML et aussi permettre une liste sélective de balises et d'attributs à travers.

les versions modernes de PHP navire avec l'extension de filtre , qui offre un moyen complet de nettoyer les entrées de l'utilisateur.

Validation

S'assurer que les données soumises sont exemptes de contenu inattendu n'est que la moitié du travail. Vous devez également essayer de vous assurer que les données soumises contiennent des valeurs vous pouvez travailler avec.

si vous attendez un nombre entre 1 et 10, vous devez vérifier cette valeur. Si vous utilisez l'une de ces nouvelles entrées numériques de style HTML5-era avec un spinner et des pas, assurez-vous que les données soumises sont en ligne avec le pas.

si ces données proviennent de ce qui devrait être un menu déroulant, assurez-vous que la valeur soumise est celle qui apparaît dans le menu.

Qu'en est-il des entrées de texte qui répondre à d'autres besoins? Par exemple, les entrées de date doivent être validées par strtotime ou la classe DateTime . La date donnée doit être entre les fourchettes que vous attendez. Quid des adresses e-mail? Le "filter extension peut vérifier qu'une adresse est bien formée, bien que je sois un fan de la bibliothèque is_email .

il en est de même pour tous autres contrôles de formulaires. Vous avez des boutons radio? Valider par rapport à la liste. Avoir des cases à cocher? Valider par rapport à la liste. Un téléchargement de fichier? Assurez-vous que le fichier est d'un type attendu, et traitez le nom du fichier comme des données utilisateur non filtrées.

Chaque navigateur moderne est livré avec un ensemble complet d'outils de développement intégré, ce qui le rend trivial pour quiconque de manipuler votre formulaire. Votre code doit supposer que l'utilisateur a complètement suppression de toutes les restrictions côté client sur le contenu du formulaire !

échapper des données pour le stockage

maintenant que vous avez fait en sorte que vos données sont dans le format prévu et ne contient que les valeurs attendues, vous devez vous inquiéter de la persistance de ces données au stockage.

chaque mécanisme de stockage de données a un moyen spécifique de s'assurer que les données sont correctement échappées et encodées. Si vous construisez SQL, alors la manière acceptée pour passer les données dans les requêtes est par des déclarations préparées avec des espaces réservés .

une des meilleures façons de travailler avec la plupart des bases de données SQL en PHP est le AOP extension . Il suit le modèle commun de préparation d'une déclaration , variables de liaison à la déclaration , puis envoi de la déclaration et des variables au serveur . Si vous n'avez pas travaillé avec PDO avant voici un très bon tutoriel orienté MySQL .

certaines bases de données SQL ont leurs propres extensions spécialisées en PHP, y compris SQL Server , PostgreSQL et SQLite 3 . Chacune de ces extensions a préparé un support d'instruction qui fonctionne de la même manière que PDO. Parfois, vous pouvez avoir besoin d'utiliser ces extensions au lieu de AOP pour soutenez les traits ou le comportement non-standard.

MySQL a aussi ses propres extensions PHP. Deux d'entre eux, en fait. Vous voulez seulement utiliser celui qui s'appelle mysqli . L'ancienne extension " mysql "a été dépréciée et n'est pas sûre ou saine à utiliser dans l'ère moderne.

personnellement, je ne suis pas fan de mysqli. La façon dont il effectue la liaison variable sur les déclarations préparées est inflexible et peut être une douleur utiliser. En cas de doute, utilisez AOP à la place.

si vous n'utilisez pas une base de données SQL pour stocker vos données, vérifiez la documentation de l'interface de base de données que vous utilisez pour déterminer comment passer les données en toute sécurité.

si possible, assurez-vous que votre base de données stocke vos données dans un format approprié. Stockez les numéros dans des champs numériques. Stockez les dates dans les champs de date. Stockez l'argent dans un champ décimal, pas dans un champ à virgule flottante. Examen de la documentation fournie par votre base de données sur la façon de stocker correctement différents types de données.

Echappement de données pour présentation

chaque fois que vous montrez des données aux utilisateurs, vous devez vous assurer que les données est en toute sécurité échappé, à moins que vous savoir qu'il ne devrait pas être échappé.

lors de l'émission de HTML, vous devez presque toujours passer toutes les données qui ont été fournies à l'origine par l'utilisateur par le biais de htmlspecialchars . En fait, la seule fois où vous ne devriez pas faire cela est quand vous savoir que l'Utilisateur a fourni HTML, et que vous savoir qu'il a déjà été nettoyé en utilisant une liste blanche.

parfois, vous devez générer du Javascript en utilisant PHP. Javascript n'a pas les mêmes règles d'échappement que HTML! Un moyen sûr de fournir des valeurs fournies par L'utilisateur à Javascript via PHP est par json_encode .

Et Plus

il y a beaucoup plus de nuances à la validation des données.

par exemple, l'encodage d'un jeu de caractères peut être un énorme piège . Votre demande doit suivre les pratiques décrites dans UTF-8 tout au long de ". Il y a des attaques hypothétiques qui peuvent se produire quand vous traitez des données de chaîne comme le jeu de caractères erroné.

Plus Tôt I mentionné navigateur outils de débogage. Ces outils peuvent également être utilisés pour manipuler les données des cookies. les Cookies doivent être traités comme une entrée utilisateur non fiable .

la validation et l'évasion des données ne sont qu'un aspect de la sécurité des applications web. Vous devez vous rendre compte de web application attack methodologies afin que vous puissiez construire des défenses contre eux.

375
répondu Charles 2014-05-04 04:23:12

la désinfection la plus efficace pour prévenir L'injection de SQL est la paramétrisation à l'aide de PDO . En utilisant des requêtes paramétrées, la requête est séparée des données, de sorte que supprime la menace de L'injection SQL de premier ordre.

en termes de suppression de HTML, strip_tags est probablement la meilleure idée pour supprimer HTML, car il va tout supprimer. htmlentities fait ce à quoi ça ressemble, donc ça marche aussi. Si vous devez analyser quel HTML pour permettre (qui est, vous voulez autoriser certains tags), vous devez utiliser un analyseur existant mature tel que Purifier HTML

29
répondu Derek H 2010-06-27 01:57:42

Entrée de Base de données - Comment prévenir l'Injection SQL

  1. vérifier pour s'assurer que les données de type entier, par exemple, est valide en s'assurant qu'il est effectivement un entier
    • dans le cas de non-chaînes, vous devez vous assurer que les données sont réellement le type correct
    • dans le cas de chaînes de caractères, vous devez vous assurer que la chaîne est entourée de guillemets dans la requête (évidemment, sinon il ne serait pas même travail)
  2. entrer la valeur dans la base de données tout en évitant l'injection SQL (mysql_real_escape_string ou les requêtes paramétrées)
  3. lors de la récupération de la valeur de la base de données, assurez-vous d'éviter les attaques de Scripting de sites Croisés en vous assurant que le HTML ne peut pas être injecté dans la page (htmlspecialchars)

vous devez échapper à l'entrée de l'utilisateur avant de l'insérer ou de la mettre à jour dans la base de données. Ici est une ancienne façon de le faire. Vous voudriez utiliser des requêtes paramétrées maintenant (probablement de la classe PDO).

$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);

sortie de la base de données - Comment prévenir XSS (Cross Site Scripting)

N'utiliser htmlspecialchars() qu'en sortant des données de la base de données. Il en va de même pour le purificateur HTML. Exemple:

$html['username'] = htmlspecialchars($clean['username'])

Et Enfin... ce que vous avez demandé

je dois souligner que si vous utilisez des objets AOP avec des requêtes paramétrées (la bonne façon de le faire) alors il n'y a vraiment pas de façon facile d'atteindre ce facilement. Mais si vous utilisez l'ancien 'mysql', alors c'est ce que vous besoin.

function filterThis($string) {
    return mysql_real_escape_string($string);
}
10
répondu Joe Phillips 2010-06-27 06:09:11

mes 5 cents.

personne ici ne comprend la façon dont mysql_real_escape_string fonctionne. cette fonction ne filtre ni ne" nettoie " quoi que ce soit.

Ainsi, vous ne pouvez pas utiliser cette fonction comme un filtre universel qui vous sauvera de l'injection.

vous pouvez l'utiliser seulement si vous comprenez comment dans les travaux et où il s'applique.

j'ai la réponse au très j'ai déjà écrit une question similaire.: en PHP lors de la soumission de chaînes de caractères à la base de données dois-je m'occuper des caractères illégaux en utilisant htmlspécialchars() ou utiliser une expression régulière?

S'il vous plaît cliquez pour l'explication complète de la sécurité côté base de données.

quant à la htmlentities - Charles a raison de vous dire de séparer ces fonctions.

Imaginez que vous allez insérer des données, générées par admin, qui est autorisé à poster du HTML. votre fonction sera de la gâcher.

bien que je déconseille les identités HTM. Cette fonction devenue obsolète depuis longtemps. Si vous voulez remplacer seulement < , > , et " caractères par souci de sécurité HTML - utiliser la fonction qui a été développé intentionnellement à cet effet - un htmlspecialchars() un.

4
répondu Your Common Sense 2017-05-23 12:10:45

pour l'insertion de la base de données, tout ce dont vous avez besoin est mysql_real_escape_string (ou utilisez des requêtes paramétrées). Vous ne voulez généralement pas modifier les données avant de les sauvegarder, ce qui se produirait si vous utilisiez htmlentities . Cela conduirait à un gâchis confus plus tard quand vous avez couru à travers htmlentities encore une fois pour l'afficher quelque part sur une page web.

utilisez htmlentities lorsque vous affichez les données sur une page Web quelque part.

quelque peu apparenté, si vous êtes envoyer des données soumises quelque part dans un e-mail, comme avec un formulaire de contact par exemple, assurez-vous de supprimer les lignes de nouvelles de toutes les données qui seront utilisées dans l'en-tête (comme le de: nom et adresse e-mail, subect, etc)

$input = preg_replace('/\s+/', ' ', $input);

si vous ne le faites pas, ce n'est qu'une question de temps avant que les robots de spam trouvent votre forme et l'abusent, j'ai appris à la dure.

2
répondu Rob 2010-06-27 02:23:03
2
répondu T.Todua 2018-01-12 20:51:37

Cela dépend du type de données que vous utilisez. La meilleure solution en général serait mysqli_real_escape_string mais, par exemple, vous savez qu'il n'y aura pas de contenu HTML, utiliser strip_tags ajoutera une sécurité supplémentaire.

vous pouvez également supprimer les caractères que vous savez ne pas être autorisé.

2
répondu Aaron Harun 2018-01-12 20:53:36

je recommande toujours d'utiliser un petit paquet de validation comme GUMP: https://github.com/Wixel/GUMP

Construisez toutes vos fonctions de base autour d'une bibliothèque comme celle-ci et il est presque impossible d'oublier l'assainissement. "mysql_real_escape_string" n'est pas la meilleure alternative pour un bon filtrage (comme "votre bon sens" expliqué) - et si vous oubliez de l'utiliser une seule fois, votre système entier sera attaquable par injections et d'autres méchants agression.

1
répondu Simon Schneider 2015-02-09 16:05:51

vous utilisez mysql_real_escape_string () en code similaire au suivant.

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);

comme le dit la documentation, son but est d'échapper aux caractères spéciaux dans la chaîne passée comme argument, en tenant compte du jeu de caractères courant de la connexion afin qu'il soit sûr de le placer dans un mysql_query () . La documentation ajoute également:

si les données binaires doivent être inséré, cette fonction doit être utilisée.

htmlentities () est utilisé pour convertir certains caractères dans les entities, lorsque vous produisez une chaîne de caractères dans le contenu HTML.

0
répondu kiamlaluno 2012-07-05 12:21:51