L'ultime propre/fonctions sécurisées
J'ai beaucoup d'entrées de l'utilisateur à partir de $_GET
et $_POST
... Au moment où j'écris toujours mysql_real_escape_string($_GET['var'])
..
Je voudrais savoir si vous pourriez faire une fonction qui fixe, s'échappe et nettoie la $_GET
/$_POST
tableaux tout de suite, de sorte que vous n'aurez pas à traiter avec elle à chaque fois que vous travaillez avec les entrées de l'utilisateur et ces.
Je pensais à une fonction, e.g cleanMe($input)
, et à l'intérieur, il devrait faire mysql_real_escape_string
, htmlspecialchars
, strip_tags
, stripslashes
(je pense que ce serait tout pour le rendre propre & secure) et ensuite de retour à la $input
.
Alors, est-ce possible? Faire une fonction qui fonctionne pour tous les $_GET
et $_POST
, de sorte que vous ne font que cela:
$_GET = cleanMe($_GET);
$_POST = cleanMe($_POST);
Dans votre code plus tard, lorsque vous travaillez avec des e.g $_GET['blabla']
ou $_POST['haha']
, ils sont garantis, dépouillé et ainsi de suite?
Me suis essayé un peu:
function cleanMe($input) {
$input = mysql_real_escape_string($input);
$input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
$input = strip_tags($input);
$input = stripslashes($input);
return $input;
}
stripslashes()
aprèsmysql_real_escape_string()
... mon eyeees!- Je pense que la sécurité des données dépend de ce qu'ils font et où ils viennent. Tous vos traitements ne sont pas forcément nécessaires.
- L'aide d'un maître d'assainir la fonction n'est pas la bonne solution. C'est pourquoi magic quotes a échoué. Échapper (ou mieux utiliser les solutions préparées) si et quand vous en avez besoin. Sinon, vous trouverez que vous êtes échapper au mauvais temps, et souvent plus d'une fois. Toutes ces fonctions ont des objectifs très différents, et plusieurs (par exemple,
mysql_real_escape_string
etstripslashes
) sont essentiellement des inverses. Voir [Quelle est la meilleure méthode pour nettoyer les entrées utilisateur avec PHP? ](stackoverflow.com/questions/129677) pour plus d'info. - Oah wow, cleanMe() ne s'arrête pas toutes les xss, et ne rien faire pour l'arrêter sqli en raison de
stripslashes()
. Ce code est douloureux. - double possible de Quels sont les meilleurs PHP entrée de la désinfection des fonctions?
Vous devez vous connecter pour publier un commentaire.
L'idée d'un générique à l'assainissement de la fonction est une fracture de la notion.
Il est un droit à l'assainissement de la méthode pour chaque but. L'exécution de tous indistinctement sur une corde cassera souvent elle - échapper un morceau de code HTML d'une requête SQL pause pour l'utiliser dans une page web, et vice versa. L'assainissement doit être appliquée juste avant en utilisant les données:
avant d'exécuter une requête de base de données. Le droit à l'assainissement de la méthode dépend de la bibliothèque que vous utilisez; ils sont répertoriés dans Comment puis-je prévenir l'injection SQL en PHP?
htmlspecialchars()
pour la sécurité de la sortie HTMLpreg_quote()
pour une utilisation dans une expression régulièreescapeshellarg()
/escapeshellcmd()
pour les utiliser dans une commande externeetc. etc.
À l'aide d'un "one size fits all" assainissement de la fonction, c'est comme à l'aide de cinq sortes de substances hautement toxiques de l'insecticide sur une plante qui peut, par définition, ne contiennent qu'une sorte de bug - seulement pour découvrir que vos plantes sont attaquées par un sixième type, sur lequel aucun des insecticides travail.
Toujours utiliser qu'une seule bonne méthode, idéalement droite avant de transmettre les données à la fonction. Jamais méthodes de mélange, sauf si vous en avez besoin.
Il n'y a aucun point en passant dans l'entrée par le biais de toutes ces fonctions. Toutes ces fonctions ont des significations différentes. Les données ne deviennent pas plus "propre" en appelant plus échapper-fonctions.
Si vous souhaitez stocker les entrées d'utilisateur dans MySQL, vous devez utiliser uniquement
mysql_real_escape_string
. Il est alors complètement échappé à stocker en toute sécurité dans la base de données.MODIFIER
Notez également les problèmes qui se posent avec l'aide d'autres fonctions. Si le client envoie par exemple un nom d'utilisateur pour le serveur et le nom d'utilisateur contient une esperluette (
&
), vous ne t veulent avoir appeléhtmlentities
avant de les stocker dans la base de données, car alors le nom d'utilisateur dans la base de données contiendra&
.Vous êtes à la recherche pour
filter_input_array()
.Cependant, je suggère qu'en utilisant que pour des affaires de style de validation/epuration et non SQL filtrage d'entrée.
Pour la protection contre les injections SQL, utilisez paramétrés requêtes avec mysqli ou AOP.
Le problème, c'est quelque chose de propre ou sécurisé pour une utilisation, ne sera pas pour un autre : le nettoyage de la partie d'un chemin d'accès, pour une partie d'une requête mysql, pour une sortie html (html ou en javascript ou dans une entrée de valeur), pour xml peuvent nécessiter différentes choses qui les contredit.
Mais, certaines choses peuvent être faites.
Essayez d'utiliser filter_input pour obtenir de l'utilisateur de votre entrée. Et l'utilisation les requêtes préparées pour vos requêtes SQL.
Bien que, au lieu d'un do-it-all de la fonction, vous pouvez créer une classe qui gère les entrées. Quelque chose comme ça :
Avec ce genre de choses, si vous voyez un $_POST, $GET, $_REQUEST ou $_COOKIE dans votre code, vous le savez, vous avez à changer. Et si un jour vous avez à changer la façon dont vous filtrez vos entrées, il suffit de changer la classe que vous avez fait.
Je vous propose d'installer "mod_security" si vous utilisez apache et avoir un accès complet au serveur?!
Il n'résoudre la plupart de mes problèmes. Cependant, ne vous fiez pas à un ou deux solutions, toujours écrire du code sécurisé 😉
mise à JOUR
Trouvé ce PHP ID (http://php-ids.org/); semble sympa 🙂
j'ai utilisé ce tableau passe ou get , post
Utilisation :