web-dev-qa-db-fra.com

Désinfection de la valeur d'entrée HTML

Devez-vous convertir autre chose que les guillemets (") en (") dans:

<input type="text" value="$var">

Personnellement, je ne vois pas comment vous pouvez éventuellement sortir de cela sans utiliser " on*=....

Est-ce correct?

Edit : Apparemment, certaines personnes pensent que ma question est trop vague.

<input type="text" value="<script>alert(0)</script>"> ne s'exécute pas. Ainsi, il est impossible de sortir d’une utilisation sans l’utilisation de ".

Est-ce correct?

15
KaekeaSchmear

Lorsque les utilisateurs soumettent des données, vous devez vous assurer qu'ils vous ont fourni le contenu attendu. 

Par exemple, si vous attendez un nombre, assurez-vous que les données soumises sont un nombre . Vous pouvez également convertir les données utilisateur dans d’autres types . Tout ce qui est soumis est initialement traité comme une chaîne. Par conséquent, le fait de forcer des données numériques connues à devenir un entier ou un flottant rend la désinfection rapide et sans douleur.

Vous devez vous assurer que les champs qui ne doivent contenir aucun contenu HTML ne contiennent pas réellement HTML. Vous pouvez résoudre ce problème de différentes manières.

Vous pouvez essayer d'échapper à l'entrée HTML avec htmlspecialchars . Vous ne devez pas utiliser htmlentities pour neutraliser le code HTML, car celui-ci encodera également les caractères accentués et les autres caractères qui, à son avis, doivent également l'être.

Vous pouvez essayer de supprimer tout code HTML possible. strip_tags est rapide et facile, mais aussi bâclée. HTML Purifier effectue un travail beaucoup plus approfondi en supprimant tout le code HTML et en permettant une liste blanche sélective de balises et d’attributs.

Vous pouvez utiliser les filtres OWASP PHP . Ils sont vraiment simples à utiliser et efficaces.

Vous pouvez utiliser l’extension filter , qui offre un moyen complet de nettoyer les entrées de l’utilisateur. 

Exemples

le code ci-dessous supprimera toutes les balises HTML d'une chaîne: _

$string = "<h1>Hello, World!</h1>";
$new_string = filter_var($string, FILTER_SANITIZE_STRING);
// $new_string is now "Hello, World!"

Le code ci-dessous garantira que la valeur de la variable est une adresse IP valide:

$ip = "127.0.0.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is TRUE

$ip = "127.0.1.1.1.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is FALSE

Désinfection et validation des adresses électroniques:

<?php
$a = '[email protected]';
$b = 'bogus - at - example dot org';
$c = '([email protected])';

$sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) {
    echo "This (a) sanitized email address is considered valid.\n";
}

$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) {
    echo "This sanitized email address is considered valid.";
} else {
    echo "This (b) sanitized email address is considered invalid.\n";
}

$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) {
    echo "This (c) sanitized email address is considered valid.\n";
    echo "Before: $c\n";
    echo "After:  $sanitized_c\n";    
}
?>

Référence:

Quelles sont les meilleures fonctions de désinfection d'entrée PHP?

http://code.tutsplus.com/tutorials/sanitize-and-validate-data-with-php-filters--net-2595

https://security.stackexchange.com/q/42498/71827

http://php.net/manual/en/filter.examples.sanitization.php

5

Je crois que la personne fait référence à des attaques de script entre sites. Ils ont tagué cela comme php, sécurité et xss

prends pour exemple 

<input type="text" value=""><script>alert(0)</script><"">

Le code ci-dessus exécutera le code de la boîte d’alerte;

<?php $var= "\"><script>alert(0)</script><\""; ?>
<input type="text" value="<?php echo $var ?>">

Ceci exécutera également la boîte d’alerte . Pour résoudre ce problème, vous devez vous échapper ", <>, et quelques autres pour des raisons de sécurité. PHP a quelques fonctions qui valent la peine des hauts et des bas!

htmlentities() - Convert all applicable characters to HTML entities
htmlspecialchars() - Convert special characters to HTML entities
get_html_translation_table() - Returns the translation table used by  htmlspecialchars and htmlentities
urldecode() - Decodes URL-encoded string

Ce que vous devez faire attention, c'est que vous transmettez une variable et qu'il existe des moyens de créer des erreurs et de provoquer son apparition. Votre meilleur pari est de vous assurer que les données ne sont pas formatées de manière exécutable en cas d'erreur. Mais vous avez raison si ce ne sont pas des citations, vous ne pouvez pas en parler, mais il existe des moyens que vous ou moi ne comprenons pas à ce stade qui permettront que cela se produise.

3
webternals

Si votre question est "quels types d'attaques xss sont possibles" alors vous feriez mieux de google. Je vais laisser quelques exemples de la raison pour laquelle vous devriez assainir vos entrées

  • Si l'entrée est générée par echo '<input type="text" value="$var">', alors le simple ' le casse.

  • Si l'entrée est un HTML simple dans la page PHP, alors value=<?php deadly_php_script ?> le rompt

  • S'il s'agit d'une entrée HTML simple dans un fichier HTML, la conversion de doubles guillemets devrait suffire. 

Bien que convertir d'autres symboles spéciaux (tels que <, > et ainsi de suite) soit une bonne pratique. Des informations sont entrées pour les informations qui seraient stockées sur le serveur\transférées dans une autre page\script. Vous devez donc vérifier ce qui pourrait casser ces fichiers. Disons que nous avons cette configuration:

index.html:

<form method=post action=getinput.php> <input type="text" name="xss"> <input type="submit"></form>

getinput.php:

echo $_POST['xss'];

La valeur d'entrée ;your_deadly_php_script le casse totalement (vous pouvez également nettoyer le serveur côté dans ce cas)

Si cela ne suffit pas - fournissez plus d'informations sur votre question, ajoutez d'autres exemples de votre code.

3
bigbobr

$ var = "><script>alert(0);</script> fonctionnerait ... Si vous pouvez fermer les guillemets, vous pouvez alors fermer la balise et en ouvrir une autre ... Mais je pense que vous avez raison, sans fermer les guillemets, aucune injection n'est possible ...

0
mathieu