Vous pourriez juste array_map
strip_tags
-$_POST
, mais il est beaucoup plus agréable d'écrire une fonction personnalisée pour obtenir des données de celui-ci:
function post_data($name) {
global $post_cache;
if (in_array($name, $post_cache)) {
return $post_cache[$name];
}
$val = $_POST[$name];
if (is_string($val)) {
$val = strip_tags($val);
} else if (is_array($val)) {
$val = array_map('strip_tags', $val);
}
$post_cache[$name] = $val;
return $val;
}
Cela rendra votre code plus lisible (autres qui cherchent en elle assumeront généralement que $_POST['foo']
est les données dans le champ de formulaire foo
, pas quelque chose que vous avez déjà prétraité), ne vous causera pas de problèmes avec les plugins ou les bibliothèques qui tentent d'accéder $ _POST directement, il est facile d'ajouter plus de logique à $_POST
prétraitement (unescape lorsque magic quotes sont activés est un commun) sans pourchasser tout le lieu s dans votre code où vous avez utilisé des données POST, et vous évite d'énormes maux de tête lorsque vous réalisez qu'il existe quelques champs POST dans lesquels vous avez besoin de balises HTML. Généralement, c'est une très mauvaise idée de changer directement l'un des superglobals.
De même, il est préférable d'assainir les données en sortie, pas en entrée. Différentes utilisations nécessiteront des méthodes différentes, par exemple, si vous utilisez
<div class="user_photo">
<img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>
alors $user_name
est un vecteur d'attaque XSS et strip_tags
ne vous aide pas contre du tout; vous auriez besoin de htmlspecialchars. Si les données utilisateur sont utilisées comme URL, vous aurez besoin d'une autre méthode pour vous défendre contre les URL javascript:
et ainsi de suite.
Génial.Ceci est exactement ce que je cherchais. –
Ceci ne protégera pas de XSS quand il y a des champs de formulaire avec des noms comme 'foo [bar]' ou 'foo []' que PHP convertit automatiquement en tableaux. – Tgr
@Tgr: Oui, cela échouera absolument comme vous l'avez dit, mais je pense qu'il a eu l'idée de personnaliser en fonction de ce dont il a besoin – w00d