web-dev-qa-db-fra.com

Les cookies doivent-ils être désinfectés avant d'être enregistrés?

J'ai récemment écrit un plugin et maintenant, je reviens un peu en arrière pour nettoyer toutes les entrées d'utilisateur. Je sais que je devrais supprimer tout ce qui provient de $_GET ou $_POST car un utilisateur peut y insérer des scripts malveillants.

Je désinfecte également tout ce que j'appelle via get_options que l'utilisateur a saisi simplement pour être sûr (je ne sais pas si l'API options.php désinfecte, mais c'est une autre question).

Mais qu'en est-il des cookies? Est-ce que ceux-ci doivent être désinfectés? Si c'est le cas, comment? Voici ma fonction:

$get_cookie_check = wp_kses($_GET['view_full_site'],null); //sanitize user input
$site_url  =  site_url(); 
$domain  =  parse_url($site_url, PHP_URL_Host);
    if($get_cookie_check =='true'){
        //set the cookie
        setcookie("nifty_cookie", 1, time()+86400, "/", $domain);
        $_COOKIE['nifty_cookie'] = 1;
    }
}
//cookie variable
$full_site_cookie= $_COOKIE['nifty_cookie']; 

Je ne pense pas avoir besoin d'assainir quoi que ce soit ici car je suis celui qui définit la valeur du cookie (dans ce cas à 1) via PHP. Est-ce une pensée correcte?

3
Brooke.

C'est peut-être juste une distinction personnelle mais je considère:

  • validation des donnéessignifie que les données sont "correctes"? Est-ce ce que nous attendons?
  • désinfection des donnéessignifie que les données * peuvent être utilisées en toute sécurité *

Bien qu'il puisse y avoir un certain flou, la validation des données ne se produit généralement que lorsqu'une entrée est entrée par l'utilisateur, ou certaines données sont obtenues et nous souhaitons nous assurer qu'elles sont "correctes" avant de les utiliser. Cela pourrait être le cas si nous attendons un entier, est-ce un entier, si nous attendons une date, est-il de la forme correcte? L'API d'options vous permet de définir un rappel de validation pour vos paramètres.

Désinfection des données concerne la sécurisation des données. Et cela devrait être faitanytimevous utilisez les données. La meilleure pratique consiste à désinfecter tardivement, c’est-à-dire à désinfecter juste avant de l’utiliser. En général, vous n'avez pas à vous soucier de cela pour enregistrer dans la base de données si vous utilisez les fonctions de l'API telles que update_option(), update_post_meta() etc. (sauf quedolorsque vous manipulez directement la base de données).

Mais ce qui est sûr dépend du contexte. Les données sont-elles destinées à être utilisées comme une URL, une entrée de texte, une zone de texte ou une requête SQL?

Cela dépend donc de la manière dont vous envisagez d'utiliser la variable $full_site_cookie et de la manière dont vous devriez l'assainir.


Dans ce qui précède, vous utilisez $get_cookie_check = wp_kses($_GET['view_full_site'],null);. wp_kses() est cher et il semble que vous vous attendiez à ce que le $_GET['view_full_site'] soit "vrai". Pourquoi ne pas simplement être strict avec elle:

$get_cookie_check = ( !empty( $_GET['view_full_site'] ) )
                      && 'true' == strtolower( $_GET['view_full_site'] ) );
//$get_cooke_check is now a boolean.
2
Stephen Harris