web-dev-qa-db-ja.com

保存する前にクッキーを消毒する必要がありますか?

私は最近プラグインを書きました、そして今私は少しでもすべてのユーザー入力をサニタイズするためにバックトラックしています。ユーザーが悪意のあるスクリプトを挿入する可能性があるため、$_GETまたは$_POSTから来るものはすべてサニタイズする必要があります。

また、get_optionsを介してユーザーが安全であると入力したものをサニタイズしています(options.php APIがサニタイズするかどうかは不明ですが、それは別の質問です)。

しかし、クッキーはどうですか?これらは消毒する必要がありますか?もしそうならどうですか?これが私の機能です:

$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']; 

私は、ここで何かをサニタイズする必要があるとは思っていませんが、私はPHPを使ってクッキーの値を(この場合は1に)設定しているからです。これは正しい考えですか?

3
Brooke.

これは単なる個人的な違いかもしれませんが、私は考えます:

  • データ検証は、データが「正しい」かどうかを示します。それは私たちが期待していることですか?
  • データの消毒は、そのデータが*安全に使用できることを意味します*

多少のボケがあるかもしれませんが、通常、データ入力の検証が行われたとき、または何らかのデータが取得されたときにのみデータの検証が行われ、使用する前にそのデータが正しいことを確認します。これは、整数を期待している場合、整数であり、日付を期待している場合、正しい形式ですか? options APIを使用すると、設定に対する検証コールバックを定義できます。

データの消毒は、データを安全にすることです。そしてこれをするべきですanytimeあなたはデータを使います。ベストプラクティスは、遅く消毒することです。つまり、使用する直前にのみ消毒することです。通常、update_option()update_post_meta()などのAPI関数を使用している場合は、データベースに保存するためにこれを心配する必要はありません(ただし、doを扱う場合は直接データベース)。

しかし、安全なのは状況によります。データはURL、テキスト入力、テキスト領域、またはSQLクエリとして使用されることを意図していますか。

そのため、$full_site_cookie変数をどのように使用するつもりであるかは、それをどのようにサニタイズするかによって異なります。


上記では$get_cookie_check = wp_kses($_GET['view_full_site'],null);を使います。 wp_kses()は高価で、$_GET['view_full_site']が 'true'であることを期待しているようです。それだけで厳密ではないのはなぜでしょう:

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