碰到一个问题,商城站点遭受了查询攻击,利用woocomerce的筛选器构造查询参数疯狂查询,一开始仅使用了CF的WAF,在此基础之上,增加对未登陆的查询进行限制。
一、构建一个判断功能
//登录后才能查询
function check_user_login_for_filters() {
// 检测URL中是否有特定的查询参数
$filter_param_prefix = 'filter_'; // 所有筛选参数的前缀
$query_params = array_keys($_GET);
$filtered_params = array_filter($query_params, function($key) use ($filter_param_prefix) {
return strpos($key, $filter_param_prefix) === 0;
});
// 计算筛选参数的数量
$num_filter_params = count($filtered_params);
// 计算特定筛选参数值的数量
$filter_values_counts = array_map(function($param) {
$values = isset($_GET[$param]) ? $_GET[$param] : '';
$values = is_array($values) ? $values : explode(',', $values); // 将字符串转换为数组
return count($values);
}, $filtered_params);
$total_values_count = array_sum($filter_values_counts);
// 如果满足条件(筛选参数多于3个或所有筛选参数的值总数多于4个)并且用户未登录
if (($num_filter_params > 3 || $total_values_count > 4) && !is_user_logged_in()) {
// 构建重定向URL,并附加一个参数用于提示消息
$redirect_url = add_query_arg('query_safe', "no", site_url('/login'));
wp_redirect($redirect_url); // 重定向到登录页面
exit;
}
}
add_action('template_redirect', 'check_user_login_for_filters');
二、配合js弹窗提醒
document.addEventListener('DOMContentLoaded', function() {
// 检查URL中是否有'query_safe'参数
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('query_safe') === 'no') {
// 显示提示消息
alert('【ZKCOI达温馨提示:当前查询过多,请登录后再试!】');
}
});
本文作者:ZKCOI
文章名称:如何对woocommerce筛选器防护,使用户登录后才能筛选查询?
文章链接:https://www.zkcoi.com/365up/program/3911.html
本站资源仅供个人学习和交流,如若转载,请注明出处,详见《免责声明》。
微信扫一扫
支付宝扫一扫
