2016-06-23 2 views
2

당사의 서버를 PCI 호환하고 Woocommerce 쿠키를 안전하게 설정하는 마지막 문제까지 내려 가고 있습니다. 현재 Wordpress/Woocommerce의 모든 최신 버전을 실행 중이며 서버가 전체 사이트에서 100 % SSL/HTTPS를 실행 중입니다.Woocommerce 쿠키에 보안 속성 추가

쿠키 나는 확보하기 위해 노력하고 있습니다 : woocommerce_recently_viewed

내가 시도했던 행운과 함께 다음

내 기능 파일 추가 :

add_filter('wc_session_use_secure_cookie', '__return_true'); 

이 index.php에 추가 :

@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 의미에서 "세션 쿠키"가 아닙니다. 이것은 setcookie PHP 함수로 생성 된 일반적인 쿠키입니다.

즉, ini_setwc_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); 
    } 
} 

당신이 볼 수 있듯이을, 어떤이 아니다 (실제 설정이되어야하며 기능 요청을 요청해야합니다!) $secure 매개 변수를 woocommerce 소스에 추가해야합니다.

...하지만 또 다른 방법이있다 (업데이트를 통해 좀 원숭이 패치는하지만, 헤이, 적어도 우리가 아프게하지 않는 일이) :

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

답변 해 주셔서 감사합니다. 나는 모든 쿠키를 안전하게 전환하기 위해 일반 설정에서 선택 사항과 함께 풀 요청을 제출했지만 현상금을 수여했습니다. 이 기능이 이미 거기에 없다는 말은 벙어리. 다시 한번 감사드립니다. –

관련 문제