2016-06-23 11 views
2

サーバーをPCIに準拠させようとしており、Woocommerce Cookieを安全に設定するという最後の問題にまで至りました。私はWordpress/Woocommerceのすべての現在のバージョンを実行しており、サーバーはサイト全体で100%SSL/HTTPSを実行しています。Woocommerce Cookieにセキュリティ保護された属性を追加する

私は確保しようとしていますクッキー:woocommerce_recently_viewed

私は運で次のことを試してみました:index.phpに追加しました

add_filter('wc_session_use_secure_cookie', '__return_true'); 

私の機能ファイルに追加

@ini_set('session.cookie_httponly', 'On'); 
@ini_set('session.cookie_secure', 'On'); 
@ini_set('session.use_only_cookies', 'On'); 

php.iniに追加されました:

session.cookie_httponly = 1 
session.cookie_secure = 1 
session.use_only_cookies = 1 

私の最後の手段は、(私はNginxを実行していますが)サーバーの設定を調整することですが、むしろアプリケーションレベルでこの問題を処理します。この問題に関する助けがあれば幸いです。

答えて

2

最初のもの:woocommerce_recently_viewedは、PHPの意味では「セッションクッキー」ではありません。これは、PHP関数setcookieで作成された通常のクッキーです。

これは、ini_setでもwc_session_use_secure_cookieもその動作を変更しないことを意味します。

私はWooCommerceのソースコードをダウンロードしてwoocommerce\includes\wc-product-functions.php見つけた:

/** 
* Track product views. 
*/ 
function wc_track_product_view() { 
    if (! is_singular('product') || ! is_active_widget(false, false, 'woocommerce_recently_viewed_products', true)) { 
     return; 
    } 

    global $post; 

    if (empty($_COOKIE['woocommerce_recently_viewed'])) 
     $viewed_products = array(); 
    else 
     $viewed_products = (array) explode('|', $_COOKIE['woocommerce_recently_viewed']); 

    if (! in_array($post->ID, $viewed_products)) { 
     $viewed_products[] = $post->ID; 
    } 

    if (sizeof($viewed_products) > 15) { 
     array_shift($viewed_products); 
    } 

    // Store for session only 
    wc_setcookie('woocommerce_recently_viewed', implode('|', $viewed_products)); 
} 

add_action('template_redirect', 'wc_track_product_view', 20); 

wc_setcookieは、次のように定義される(woocommerce\includes\wc-core-functions.php):

/** 
* Set a cookie - wrapper for setcookie using WP constants. 
* 
* @param string $name Name of the cookie being set. 
* @param string $value Value of the cookie. 
* @param integer $expire Expiry of the cookie. 
* @param string $secure Whether the cookie should be served only over https. 
*/ 
function wc_setcookie($name, $value, $expire = 0, $secure = false) { 
    if (! headers_sent()) { 
     setcookie($name, $value, $expire, COOKIEPATH ? COOKIEPATH : '/', COOKIE_DOMAIN, $secure); 
    } elseif (defined('WP_DEBUG') && WP_DEBUG) { 
     headers_sent($file, $line); 
     trigger_error("{$name} cookie cannot be set - headers already sent by {$file} on line {$line}", E_USER_NOTICE); 
    } 
} 

あなたが見ることができるように、いずれかが存在しませんあなたがwoocommerceのソースに$secureパラメータを追加する必要があるので、(実際に設定されている必要があります、機能要求を尋ねる!)にフックするワードプレスフィルタ...

...しかし、別の方法がある(アップデート全体ちょっとサル・パッチは、ちょっと、少なくとも私たちは壊れていないものが):

function custom_wc_track_product_view() { 
    if (! is_singular('product') || ! is_active_widget(false, false, 'woocommerce_recently_viewed_products', true)) { 
     return; 
    } 

    global $post; 

    if (empty($_COOKIE['woocommerce_recently_viewed'])) 
     $viewed_products = array(); 
    else 
     $viewed_products = (array) explode('|', $_COOKIE['woocommerce_recently_viewed']); 

    if (! in_array($post->ID, $viewed_products)) { 
     $viewed_products[] = $post->ID; 
    } 

    if (sizeof($viewed_products) > 15) { 
     array_shift($viewed_products); 
    } 

    // Store for session only 
    wc_setcookie('woocommerce_recently_viewed', implode('|', $viewed_products), 0, true); 
} 

remove_action('template_redirect', 'wc_track_product_view', 20); 
add_action('template_redirect', 'custom_wc_track_product_view', 20); 

私は別の名前の関数をコピーした、やりました私が必要とした変更は、私は私のオリジナルのフックに置き換えました。このコードを新しいプラグインまたはテーマfunctions.phpに入れてください。

悲しいことに、WooCommerceのコラボレーションなしでは良い方法はありません。

+1

お返事ありがとうございます。私はあなたに賞金を授与しましたが、一般的な設定でオプションを指定してプルリクエストを提出して、すべてのクッキーを安全に切り替えました。この機能は既にそこにはなかったとダム。再度、感謝します.. –

関連する問題