总有人间一两风,填我十万八千梦

WordPress修改默认搜索参数s,$_GET[‘s’],防范垃圾营销恶意访问

PHP Zero、J 1406℃ 0评论

最近几天,博客一直被垃圾营销攻击,一直通过/?s=xxxx 搜索接口进行大量的营销搜索,如果只是偶尔来一次,我还能忍受,玩玩没想到,这种垃圾营销到了晚上就是一直循环访问,以至于我的服务器被运营商判定为被CC攻击了,然后服务器IP地址被间歇性封停,不过也只能说景安的云空间确实LJ,我转到阿里云之后一点问题都没有,同样的价格还是用大厂商的服务器吧 。

通过服务器日志,可以看到,这种垃圾营销主要是推广QQ、微信、APP之类的,如图所示,这些%开头的字符串是URL编码,你可以通过JS的 decodeURI 或者PHP的 urldecode 函数进行解码,毋庸置疑,这些解码后的结果都是如出一辙的垃圾营销。

这些s后的参数,是URL编码,JS通过decodeURI,PHP通过urldecode可以解析

刚开始看到这些个东西的时候,还想着把百度云加速的CC防御拉大吧(LZ用的是免费版本的云加速),结果还是有这些垃圾营销。想了想,这些垃圾营销攻击实际上只是探测到了我是WordPress,就会一直使用WordPress的s搜索参数搞事情,如果我修改了WordPress的默认搜索参数,会不会能够解决(因为搜索耗费的服务器资源是比较大的)。经过一番查找,我找到了一个方案(如果你使用此方案,你需要对你的主题搜索文件中的默认s搜索参数进行修改),LZ是一个WordPess的白痴,如果说错了,请见谅。

这里我要说一下,我翻阅了WordPress的代码,似乎WordPress中的搜索参数是写死的,就是s参数。我并不想去更改WordPress的核心代码,因为我未来还会继续更新WordPress。因此我给出的方案是:

  • 用户前端传入一个自定义的搜索参数,例如是sk,我们在后台处理中检测一下这个参数,如果存在,那么就在WordPress的参数中增加一个s参数,这样WordPress的处理流程中依然会认为s参数存在,就会进行搜索处理;
  • 如果前端传入的参数中包含了s参数,那么我们就可以判定,这个搜索并不是正常的,因为我们前端的搜索表单中已经修改了搜索的参数是sk了,此时就可以忽略掉,或者进行其他的奇怪的处理,嘿嘿嘿

解决方案:

打开你的主题functions.php文件,我们增加两个filter, query_vars request , 有人会问为什么不用 parse_query 这个filter,很可惜,我翻阅了代码, parse_query 这个filter会在WP_Query->parse_query 调用之后才进行处理,此时的参数已经解析完成了,并且 is_search 已经被确定了,我这里使用 request 的目的就是想要更提前的处理;同时,为了保证WordPress不回过滤掉我们的自定义参数sk,我们需要在query_vars 中告知WordPress这个自定义的参数sk,这样WordPress在处理参数的时候就会保留这个sk。代码处理如下:

define('DEFAULT_QUERY_PARAMTER','s');	//默认搜索关键字,区分大小写
define('SELF_FRONT_QUERY_PARAMTER','sk');//自定义的搜搜参数sk

//允许,自定义的查询关键字,否则,前台自定义的关键字会被过滤掉
add_filter('query_vars',function($vars){
	//只针对前台
	if(!is_admin()){
		$vars[] = SELF_FRONT_QUERY_PARAMTER;
	}
	return $vars;
});
add_filter('request', function($search_vars){
	//后台的请求,依然通过s,不用处理
        //前端用户的正常搜索,就看看是不是自定义的参数
	if(!is_admin()){
		if(isset($search_vars[DEFAULT_QUERY_PARAMTER])){
			http_response_code(503);
			die();
		}
		//如果存在自定义的搜索,更换为s参数
		if(isset($search_vars[SELF_FRONT_QUERY_PARAMTER])){
			$search_vars[DEFAULT_QUERY_PARAMTER] = $search_vars[SELF_FRONT_QUERY_PARAMTER];
		}
	}
	return $search_vars;
});

通过,上面的操作,我们的搜索请求只会接受sk这个自定义的参数,由于我们的搜索是在主题的搜索表单中提供的表单域的,因此我们需要对主题中的搜索框所在的表单中的搜索关键字的name值进行修改,例如这里我使用的是欲思主题,他的搜搜表单位于主题文件件下的header.php文件中,如图所示。

这个name值原始是name=”s”

OK ,完成之后,再去试试你的搜索吧,是不是使用sk就生效了,使用s参数就会503了。

当然,对于恶意营销的垃圾,LZ并没有善罢甘休,预知后事如何请看下回下篇文章的详解。

转载请注明:悠然品鉴 » WordPress修改默认搜索参数s,$_GET[‘s’],防范垃圾营销恶意访问

喜欢 (0)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址