2016-06-23 18 views
2

Ich versuche, unseren Server PCI-konform und bis zur letzten Frage der Einstellung der Woocommerce-Cookies zu sichern. Ich laufe alle aktuellen Versionen von Wordpress/WooCommerce und der Server läuft 100% SSL/HTTPS über die gesamte Website.Hinzufügen von sicheren Attribut zu Woocommerce Cookies

Die Cookies ich sicher bin versucht: woocommerce_recently_viewed

Ich habe versucht, die folgenden ohne Glück:

hinzugefügt meine Funktionen file:

add_filter('wc_session_use_secure_cookie', '__return_true'); 

zu index.php Hinzugefügt:

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

Hinzugefügt zu php.ini:

Meine letzte Möglichkeit ist es, die Serverkonfiguration anzupassen (ich benutze Nginx) ABER würde dieses Problem eher auf Anwendungsebene behandeln. Jede Hilfe zu diesem Thema würde sehr geschätzt werden.

Antwort

2

Erste Dinge zuerst: ist kein "Session-Cookie" im Sinne von PHP. Es ist ein normaler Cookie, der mit der PHP-Funktion setcookie erstellt wurde. Das bedeutet, dass weder ini_set noch wc_session_use_secure_cookie dieses Verhalten ändern.

ich die WooCommerce Quellcode heruntergeladen haben und gefunden 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); 

Die wc_setcookie ist wie folgt definiert (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); 
    } 
} 

Wie Sie sehen können, gibt es keine Wordpress-Filter zum Einhängen (sollte wirklich eine Einstellung sein, Fragen Sie eine Funktion Anfrage!), so müssen Sie die $secure Parameter zu den Woocommerce Quellen hinzufügen ...

... aber es ist eine andere Art und Weise (ein bisschen Affe-Patch, aber hey, zumindest wir nicht brechen Dinge über Updates):

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); 

ich die Funktion mit einem anderen Namen kopiert haben, hat die Änderungen, die ich brauchte, dann habe ich den Originalhaken durch meinen ersetzt. Setzen Sie diesen Code in ein neues Plugin oder in Thema functions.php.

Leider gibt es keinen besseren Weg ohne WooCommerce Collaboration.

+1

Danke für die Antwort. Ich habe Ihnen das Kopfgeld zugesprochen, obwohl ich eine Pull-Anfrage mit einer Option in den allgemeinen Einstellungen eingereicht habe, um alle Cookies zu sichern. Dumm, dass diese Funktion nicht schon da war. Danke noch einmal.. –

Verwandte Themen