向 Woocommerce cookie 添加安全属性
Adding secure attribute to Woocommerce cookies
我正在努力使我们的服务器符合 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),但宁愿在应用程序级别处理这个问题。非常感谢对此问题的任何帮助。
首先要注意的是:woocommerce_recently_viewed
不是 PHP 意义上的 "session cookie"。它是使用 setcookie
PHP 函数创建的普通 cookie。
这意味着 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 );
}
}
如您所见,没有任何 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 协作就没有更好的方法。
我正在努力使我们的服务器符合 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),但宁愿在应用程序级别处理这个问题。非常感谢对此问题的任何帮助。
首先要注意的是:woocommerce_recently_viewed
不是 PHP 意义上的 "session cookie"。它是使用 setcookie
PHP 函数创建的普通 cookie。
这意味着 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 );
}
}
如您所见,没有任何 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 协作就没有更好的方法。