Je suis très nouveau pour PHP/programmation, dans cet esprit, que je suis en train d’aboutir à une fonction que je peux passer tous mes cordes à travers sanatize. Pour que la chaîne qui en sort sera sécurisée pour insertion de base de données. Mais il y a tellement de fonctions filtrage là-bas que je ne sais pas lesquels je devrais utiliser/besoin. S’il vous plaît m’aider à combler les vides :
Réponses
Trop de publicités?Stop!!!
Vous faites une erreur ici. Oh, non, vous avez choisi les bonnes fonctions PHP pour rendre vos données un peu plus sûr. C'est très bien. Votre erreur est dans l' ordre des opérations, et où et comment utiliser ces fonctions.
Il est important de comprendre la différence entre la désinfection et la validation des données de l'utilisateur, en s'échappant de données pour le stockage, et d'échapper à des 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.
Nettoyage et Filtrage
Par exemple, si vous vous attendez à un nombre, assurez-vous que les données présentées est un nombre. Vous pouvez également jeté les données de l'utilisateur dans d'autres types. Tout soumis est d'abord traité comme une chaîne, afin de forcer connu-des données numériques dans un integer ou float rend le nettoyage rapide et indolore.
Qu'en texte libre, les champs et les 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 doivent pas avoir n'importe quel contenu HTML ne contient pas de HTML. Il y a deux façons dont vous pouvez faire face à ce problème.
Tout d'abord, vous pouvez essayer de s'échapper HTML entrée avec htmlspecialchars
. Vous ne devez pas utiliser htmlentities
de neutraliser HTML, car il permettra également d'effectuer le codage de accentués et autres caractères qu'il pense aussi besoin d'être codé.
Deuxièmement, vous pouvez essayer la suppression de toute possibilité de HTML. strip_tags
est rapide et facile, mais aussi bâclée. HTML Purificateur fait un travail beaucoup plus approfondi à la fois le décapage de tous HTML et en permettant une sélectifs de la liste blanche de balises et d'attributs à travers.
Moderne les versions de PHP navire avec l'extension de filtre, qui fournit un ensemble complet de façon à assainir la saisie de l'utilisateur.
Validation
S'assurer que les données envoyées sont gratuits à partir d'un contenu inattendu est seulement la moitié du travail. Vous devez aussi essayer de faire en sorte que les données soumises contient les valeurs que vous pouvez travailler avec.
Si vous vous attendez à un nombre entre 1 et 10, vous devez vérifier que la valeur de. Si vous utilisez l'un de ces nouveaux fantaisie HTML5-ère numérique entrées avec un spinner et les étapes, assurez-vous que les données transmises en ligne avec le step.
Si les données proviennent de ce que devrait être un menu déroulant, assurez-vous que la valeur envoyée est celle qui est apparue dans le menu.
Ce texte à propos des entrées pour répondre à d'autres besoins? Par exemple, la date d'entrées doivent être validés par strtotime
ou de la classe DateTime. La date doit être comprise entre les plages vous attendent. Quid des adresses e-mail? Précédemment mentionnées de l'extension du filtre peut vérifier que l'adresse est bien formé, même si je suis un fan de la is_email de la bibliothèque.
Le même est vrai pour tous les autres contrôles de formulaire. Avoir des boutons radio? Valider à l'encontre de la liste. Avoir des cases à cocher? Valider à l'encontre de la liste. Avoir un upload de fichier? Assurez-vous que le fichier est de type attendu, et de traiter le fichier comme non filtré les données de l'utilisateur.
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 supprimé tous les côté client des restrictions sur le contenu d'un formulaire!
S'échapper de Données pour le Stockage
Maintenant que vous avez fait en sorte que vos données dans le format attendu et ne contient que des valeurs attendues, vous avez besoin de s'inquiéter de la persistance de données pour le stockage.
Chaque mécanisme de stockage des données a une manière spécifique de s'assurer que les données sont correctement échappé et codée. Si vous êtes la construction de SQL, puis le moyen accepté de passer les données dans des requêtes est par le biais de 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 l' extension PDO. Il suit le schéma classique de la préparation d'une déclaration, la liaison des variables à l'instruction, puis l'envoi de la déclaration et des variables pour le serveur. Si vous n'avez pas travaillé avec PDO avant voici un assez bon MySQL orientée tutoriel.
Certaines bases de données SQL ont leur propre spécialité des extensions en PHP, y compris SQL Server, PostgreSQL et SQLite 3. Chacune de ces extensions a préparé la déclaration de soutien qui opère dans le même préparer-bind-exécuter la mode, de l'AOP. Parfois, vous devrez peut-être utiliser ces extensions à la place de l'AOP à l'appui de caractéristiques non standard ou de comportement.
MySQL dispose également de ses propres extensions PHP. Deux d'entre eux, en fait. Vous ne voulez jamais utiliser l'un appelé mysqli. L'ancien "mysql" extension a été obsolète et n'est pas sûr ou sain d'esprit pour une utilisation dans l'ère moderne.
Personnellement, je suis pas un fan de mysqli. La façon dont il effectue la variable de liaison sur les instructions préparées est rigide et peut être une douleur à utiliser. En cas de doute, utiliser PDO à la place.
Si vous n'êtes pas à l'aide d'une base de données SQL pour stocker vos données, consultez la documentation de l'interface de base de données que vous utilisez pour déterminer la manière sécuritaire de transmettre des données à travers elle.
Si possible, assurez-vous que votre base de données stocke vos données dans un format approprié. Stocker des nombres dans les champs numériques. Enregistrer des dates dans les champs de date. Stocker de l'argent dans un champ décimal, pas de virgule flottante de champ. Examen de la documentation fournie par votre base de données sur la manière de stocker différents types de données.
S'échapper de Données pour la Présentation
Chaque fois que vous montrez des données pour les utilisateurs, vous devez vous assurer que les données en toute sécurité est échappé, sauf si vous savez qu'il ne devrait pas être échappés.
En émettant HTML, vous devriez presque toujours passer toutes les données qui a été initialement fourni par l'utilisateur par le biais htmlspecialchars
. En fait, le seul moment où vous ne devriez pas le faire c'est quand vous savez que l'utilisateur a fourni HTML, et que vous savez que c'est déjà l'été désinfectés à l'aide d'une liste blanche.
Parfois, vous avez besoin de générer une partie du code Javascript à l'aide de PHP. Le Javascript n'ont pas la même échapper règles de HTML! Un moyen sûr de fournir à l'utilisateur des valeurs fournies pour Javascript via PHP est par json_encode
.
Et Plus
Il y a beaucoup plus de nuances à la validation de données.
Par exemple, le codage du jeu de caractères peut être un énorme piège. Votre application doit respecter les pratiques décrites dans la section "UTF-8 tout le chemin à travers". Il y a hypothétiques attaques qui peuvent se produire lorsque vous traitez des données de chaîne comme le mauvais jeu de caractères.
J'ai mentionné plus tôt navigateur outils de débogage. Ces outils peuvent également être utilisés pour manipuler des données de cookie. Les Cookies doivent être traités comme non fiables saisie de l'utilisateur.
La validation des données et d'échappement sont qu'un aspect de la sécurité des applications web. Assurez-vous de connaître de l' application web de l'attaque de méthodologies , de sorte que vous pouvez construire des défenses contre eux.
Les plus efficaces d'assainissement pour prévenir l'injection SQL est un paramétrage à l'aide de PDO
. Utilisation de requêtes paramétrées, la requête est séparé des données, ce qui supprime la menace de premier ordre SQL injection.
En termes de retrait de HTML, strip_tags
est probablement la meilleure idée pour enlever le HTML, comme il l'enlever tout simplement. htmlentities
fait quoi cela ressemble, de sorte que les œuvres, trop. Si vous avez besoin de parser HTML de permis (qui est, vous voulez permettre à certaines balises), vous devez utiliser une mature existante analyseur tels que HTML Purificateur d'
Entrée de base de données - Comment prévenir l'Injection SQL
- Assurez-vous que les données de type entier, par exemple, est valable en s'assurant qu'il est en fait un entier
- En cas de non-cordes vous devez vous assurer que les données de fait est le bon type de
- Dans le cas de chaînes, vous devez vous assurer que la chaîne est entouré par des guillemets dans la requête (évidemment, sinon ça ne marche même pas)
- Entrez la valeur dans la base de données tout en évitant l'injection SQL (mysql_real_escape_string ou des requêtes paramétrées)
- Lors de la Récupération de la valeur à partir de la base de données, assurez-vous d'éviter de Cross Site Scripting attaques en vous assurant que le HTML ne peut pas être injecté dans la page (htmlspecialchars)
Vous avez besoin d'échapper à la saisie de l'utilisateur avant d'insérer ou de mettre à jour dans la base de données. Ici est une ancienne façon de le faire. Vous pouvez utiliser des requêtes paramétrées maintenant (probablement à partir 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 à partir de la base de données - Comment prévenir les attaques de type XSS (Cross Site Scripting)
Utiliser htmlspecialchars()
seulement lors de la sortie des données de la base de données. La même chose s'applique pour le HTML Purificateur. Exemple:
$html['username'] = htmlspecialchars($clean['username'])
- Acheter ce livre si vous le pouvez: Essentiel PHP de Sécurité
- Lire aussi cet article: Pourquoi mysql_real_escape_string est important et certains pièges
Et Enfin... ce que vous avez demandé
Je dois souligner que, si vous utilisez PDO objets avec des requêtes paramétrées (la bonne façon de le faire), alors il n'y a vraiment pas de moyen facile de réaliser cela facilement. Mais si vous utilisez l'ancien 'mysql', alors c'est ce que vous auriez besoin.
function filterThis($string) {
return mysql_real_escape_string($string);
}
Il dépend du type de données que vous utilisez. Le général meilleur à utiliser serait `` mais, par exemple, vous savez qu’il n’y aura HTML contenu, à l’aide de strip_tags va ajouter une sécurité supplémentaire.
Vous pouvez également supprimer des caractères vous savez ne devraient pas être autorisés.
Pour la base de données d'insertion, vous avez besoin d' mysql_real_escape_string
(ou utiliser des requêtes paramétrées). En général, vous ne voulez pas modifier les données avant de les enregistrer, ce qui est ce qui se passerait si vous avez utilisé htmlentities
. Qui aurait conduit à un brouillage des mess plus tard, quand vous il a couru à travers htmlentities
nouveau pour l'afficher quelque part sur une page web.
Utiliser htmlentities
lorsque vous affichez les données sur une page web quelque part.
Liée en quelque sorte, si vous envoyez des données soumises, quelque part, dans un courriel, comme avec un formulaire de contact par exemple, assurez-vous de la bande des retours à la ligne à partir de toutes les données qui seront utilisées dans l'en-tête (comme le nom et l'adresse e-mail, subect, etc)
$input = preg_replace('/\s+/', ' ', $input);
Si vous ne le faites pas, c'est juste une question de temps avant que les robots de spam trouver votre forme et de l'abus, j'ai appris à la dure.