在一次查询中通过所有 mysql 数据库删除子字符串
Delete substring via all mysql database at one query
我有一个问题,因为某种恶意软件进入了我的网站。我想通过 1 个查询从数据库中删除所有恶意代码。我相信这是可能的。
我无法删除所有行,恶意软件已向每个 page/article/gallery/... 标题添加了一些代码。所以我想保留文章的原始标题。我希望这是可能的。
例如:
<script src="...">...</script>About us
我需要 About us
将保留在数据库中。
我怎样才能一次通过所有数据库做到这一点?
您可以使用 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 更正数据,一次一列和一列 table:
UPDATE MyTable
SET MyStringColumn = CONCAT(
SUBSTRING(MyStringColumn, 1, LOCATE('<script ', MyStringColumn)-1),
SUBSTRING(MyStringColumn, LOCATE('</script>', MyStringColumn)+LENGTH('</script>')));
如果您想一次完成所有 table 和所有列,另一种解决方案是将数据库转储到文本文件,然后使用文本编辑器进行全局搜索和替换。
$ mysqldump mydatabase > mydatabase.sql
$ vim mydatabase.sql
:%s/<script src=.*<\/script>//g
$ mysql mydatabase < mydatabase.sql
当然,在转储和恢复之间更改的任何数据都将被覆盖。
如果您不能暂停对数据库的更改,则必须使用 UPDATE 解决方案来更改数据 in-place。
我有一个问题,因为某种恶意软件进入了我的网站。我想通过 1 个查询从数据库中删除所有恶意代码。我相信这是可能的。
我无法删除所有行,恶意软件已向每个 page/article/gallery/... 标题添加了一些代码。所以我想保留文章的原始标题。我希望这是可能的。
例如:
<script src="...">...</script>About us
我需要 About us
将保留在数据库中。
我怎样才能一次通过所有数据库做到这一点?
您可以使用 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 更正数据,一次一列和一列 table:
UPDATE MyTable
SET MyStringColumn = CONCAT(
SUBSTRING(MyStringColumn, 1, LOCATE('<script ', MyStringColumn)-1),
SUBSTRING(MyStringColumn, LOCATE('</script>', MyStringColumn)+LENGTH('</script>')));
如果您想一次完成所有 table 和所有列,另一种解决方案是将数据库转储到文本文件,然后使用文本编辑器进行全局搜索和替换。
$ mysqldump mydatabase > mydatabase.sql
$ vim mydatabase.sql
:%s/<script src=.*<\/script>//g
$ mysql mydatabase < mydatabase.sql
当然,在转储和恢复之间更改的任何数据都将被覆盖。
如果您不能暂停对数据库的更改,则必须使用 UPDATE 解决方案来更改数据 in-place。