在一个查询中通过所有mysql数据库删除子字符串

问题描述 投票:1回答:1

我有一个问题,导致某些恶意软件进入我的网站。我想从1个查询中删除DB中的所有恶意软件代码。我相信这是可能的。

我无法删除所有行,恶意软件为每个页面/文章/图库/ ...标题添加了一些代码。所以我想保留文章的原始标题。我希望这是可能的。

例如:

<script src="...">...</script>About us

我需要About us将保留在数据库中。我怎么能一次通过所有数据库做到这一点?

mysql malware
1个回答
1
投票

你可以使用string functions来做到这一点。

这是一个演示:

mysql> SET @t = 'See <script src="...">...</script>About us';

mysql> SELECT CONCAT(
  SUBSTRING(@t, 1, LOCATE('<script ', @t)-1), 
  SUBSTRING(@t, LOCATE('</script>', @t)+LENGTH('</script>'))) AS newstring;
+--------------+
| newstring    |
+--------------+
| See About us |
+--------------+

这假设脚本标记仅在每个字符串中出现一次。

然后,您将不得不使用UPDATE来一次更正数据,一列和一个表:

UPDATE MyTable
SET MyStringColumn = CONCAT(
      SUBSTRING(MyStringColumn, 1, LOCATE('<script ', MyStringColumn)-1), 
      SUBSTRING(MyStringColumn, LOCATE('</script>', MyStringColumn)+LENGTH('</script>')));

如果要同时执行所有表和所有列,则另一种解决方案是将数据库转储到文本文件,并使用文本编辑器进行全局搜索和替换。

$ mysqldump mydatabase > mydatabase.sql

$ vim mydatabase.sql

  :%s/<script src=.*<\/script>//g

$ mysql mydatabase < mydatabase.sql

当然,转储和恢复之间更改的任何数据都将被覆盖。

如果您无法暂停对数据库的更改,则必须使用UPDATE解决方案来就地更改数据。

© www.soinside.com 2019 - 2024. All rights reserved.