【问题标题】:Adding secure attribute to Woocommerce cookies向 Woocommerce cookie 添加安全属性
【发布时间】:2016-10-25 02:38:52
【问题描述】:

我正在尝试使我们的服务器符合 PCI 标准,并一直到将 Woocommerce cookie 设置为安全的最后一期。我正在运行所有当前版本的 Wordpress/Woocommerce,并且服务器在整个站点上运行 100% SSL/HTTPS。

我要保护的 cookie: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)但宁愿在应用程序级别处理这个问题。对此问题的任何帮助将不胜感激。

【问题讨论】:

    标签: wordpress cookies nginx woocommerce pci-compliance


    【解决方案1】:

    第一件事:woocommerce_recently_viewed 不是 PHP 意义上的“会话 cookie”。它是使用setcookie PHP 函数创建的普通cookie。

    这意味着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 );
        }
    }
    

    如您所见,没有任何可挂钩的 wordpress 过滤器(应该是真正的设置,请询问功能请求!),因此您需要将 $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 合作没有更好的方法。

    【讨论】:

    • 感谢您的回答。尽管我提交了一个拉取请求,并在常规设置中提供了将所有 cookie 切换为安全的选项,但我还是奖励了你。愚蠢的是,这个功能还没有。再次感谢..
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2013-09-10
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多