57 votes

La fonction ultime de nettoyage / sécurité

J'ai beaucoup d'entrées de l'utilisateur à partir d' $_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 l' $_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 de celle-ci, il n' mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes (je pense que ce serait tout pour le rendre propre et sécuritaire) et ensuite de retour à l' $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);

Donc, 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;
}

127voto

Pekka 웃 Points 249607

L'idée d'un générique à l'assainissement de la fonction est une fracture de la notion.

Il y a 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é juste avant à l'aide de 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 HTML

  • preg_quote() pour les utiliser dans une expression régulière

  • escapeshellarg() / escapeshellcmd() pour les utiliser dans une commande externe

  • etc. 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 de travail.

Toujours utiliser une bonne méthode, idéalement droite avant de transmettre les données à la fonction. Ne jamais mélanger les méthodes, sauf si vous en avez besoin.

7voto

Tomas Points 3006

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 à des fonctions.

Si vous souhaitez stocker les entrées d'utilisateur dans MySQL, vous devez utiliser seulement 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 &.

6voto

Alan Pearce Points 678

Vous recherchez filter_input_array() . Cependant, je suggère de ne l'utiliser que pour la validation / désinfection de style métier et non pour le filtrage des entrées SQL.

Pour vous protéger contre l’injection SQL, utilisez des requêtes paramétrées avec mysqli ou PDO .

3voto

Arkh Points 5804

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 de l'utilisation des 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 :

class inputManager{
  static function toHTML($field){
    $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
    return $data;
  }
  static function toSQL($field, $dbType = 'mysql'){
    $data = filter_input(INPUT_GET, $field);
    if($dbType == 'mysql'){
      return mysql_real_escape_string($data);
    }
  }
}

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.

1voto

Puis-je suggérer d'installer "mod_security" si vous utilisez Apache et que vous avez un accès complet au serveur?!
Cela a résolu la plupart de mes problèmes. Cependant, ne comptez pas sur une ou deux solutions, écrivez toujours du code sécurisé;)
UPDATE Trouvé ce PHP IDS (http://php-ids.org/); Ça a l'air bien :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X