Здравствуйте, уважаемые читатели и посетители блога 4remind.ru. Многие знают, что нередко случаются взломы блогов и сайтов на движке WordPress. Одна из причин происходящего кроется в массовом применении начинающими вебмастерами настроек блога WordPress по умолчанию, например использование одного и того же префикса таблиц базы данных WordPress. В этой статье речь пойдет о методе замены всем известного префикса «wp_» на более надежный, который труднее будет угадать и подобрать злоумышленникам.
Я распишу все по шагам, которые сам проделывал для замены префикса таблиц в базе данных своего блога и блогов знакомых. Так что все проверено на личном опыте. Последняя проверка производилась на WordPress 3.3.1.
Итак, друзья, приступим к аккуратной замене префикса таблиц базы данных WordPress.
Этап №1 — Бэкап базы данных
Для начала необходимо обязательно сделать бэкап текущей Базы Данных и сохранить его в надежном месте!!!
Идем дальше… Предположим, что мы собираемся заменить установленный по умолчанию префикс таблиц «wp_» на новый, более надежный, поэтому далее в тексте будут использоваться следующие условные обозначения:
«wp_» — старый префикс таблиц базы данных WordPress;
«NEWPREF_» — новый префикс таблиц базы данных WordPress;
Не забывайте, что в приведенных ниже кодах вам необходимо заменить все вхождения этих условных обозначений на ваши собственные.
Этап №2 — Создание таблиц базы данных с новым префиксом
Приступим к процедуре замены префикса таблиц базы данных используя phpMyAdmin.
Начнем создавать новые таблицы. Заодно в новые таблицы сразу будут копироваться данные из старых (текущих) таблиц. Блог в это время будет работать, как и работал, так как мы пока не вмешиваемся в таблицы, используемые блогом на данный момент.
Забегая вперед скажу, что конечно можно было бы на этом шаге взяться за банальное переименование существующих таблиц, чтобы сменить префикс у них, например с помощью запросов типа
RENAME TABLE OLDPREFIX_table TO NEWPREFIX_table
но мы все сделаем другим, более аккуратным и «щадящим» способом. Ведь если к примеру малоопытный вебмастер будет переименовывать каждую таблицу вручную, то это может занять много времени, а тем временем блог не будет работать, то есть будет недоступен для посетителей.
Создаем список SQL-запросов, в которых должны быть перечислены практически все таблицы, которые используются в базе данных вашего блога, включая таблицы, созданные плагинами (если таковые конечно имеются). В этом списке после слова «TABLE» вставляются имена таблиц с новым префиксом, а после слова «FROM» вставляются имена таблиц со старым префиксом.
CREATE TABLE NEWPREF_blc_filters SELECT * FROM wp_blc_filters; CREATE TABLE NEWPREF_blc_instances SELECT * FROM wp_blc_instances; CREATE TABLE NEWPREF_blc_links SELECT * FROM wp_blc_links; CREATE TABLE NEWPREF_blc_synch SELECT * FROM wp_blc_synch; CREATE TABLE NEWPREF_commentmeta SELECT * FROM wp_commentmeta; CREATE TABLE NEWPREF_comments SELECT * FROM wp_comments; CREATE TABLE NEWPREF_links SELECT * FROM wp_links; CREATE TABLE NEWPREF_options SELECT * FROM wp_options; CREATE TABLE NEWPREF_postmeta SELECT * FROM wp_postmeta; CREATE TABLE NEWPREF_posts SELECT * FROM wp_posts; CREATE TABLE NEWPREF_terms SELECT * FROM wp_terms; CREATE TABLE NEWPREF_term_relationships SELECT * FROM wp_term_relationships; CREATE TABLE NEWPREF_term_taxonomy SELECT * FROM wp_term_taxonomy; CREATE TABLE NEWPREF_usermeta SELECT * FROM wp_usermeta; CREATE TABLE NEWPREF_users SELECT * FROM wp_users;
Теперь заходим в phpMyAdmin, снова выбираем нужную нам базу данных и переходим на закладку «SQL». Вставляем в поле для выполнения SQL-запросов приготовленный нами список запросов и выполняем их.
Можно в принципе запросы выполнять и по одному, по очереди, если есть желание.
После выполнения запросов вы получите примерно такой отчет:
Этап №3 — Замена упоминаний префикса в записях таблиц
Идем дальше. Теперь нам обязательно нужно в некоторых полях из двух новых созданных таблиц заменить упоминание старого префикса на новый. Это таблицы «NEWPREF_options» и «NEWPREF_usermeta».
В таблице с новым префиксом «NEWPREF_options» в поле «option_name>» понадобится заменить значение
«wp_user_roles» на «NEWPREF_user_roles»
В таблице с новым префиксом «NEWPREF_usermeta» нужно заменить все значения поля «meta_key», у которых в начале есть старый префикс.
Это могут быть следующие значения:
- wp_user_level
- wp_user-settings-time
- wp_user-settings
- wp_capabilities
- wp_dashboard_quick_press_last_post_id
- wp_autosave_draft_ids
- wp_metaboxorder_post
- wp_usersettings
- wp_usersettingstime
Конечно не все из выше перечисленных значений могут быть у вас в таблице «NEWPREF_usermeta». Все зависит от конфигурации и версии движка вашего блога.
Но мы все же для подстраховки проверим и заменим все найденные значения, это не помешает.
Для замены вышеупомянутых значений на новые в phpMyAdmin снова выбираем нужную нам базу данных и переходим на закладку «SQL».
Вводим там и выполняем следующие команды:
UPDATE NEWPREF_options SET option_name = 'NEWPREF_user_roles' WHERE option_name = 'wp_user_roles'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user_level' WHERE meta_key = 'wp_user_level'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user-settings-time' WHERE meta_key = 'wp_user-settings-time'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user-settings' WHERE meta_key = 'wp_user-settings'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_capabilities' WHERE meta_key = 'wp_capabilities'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_dashboard_quick_press_last_post_id' WHERE meta_key = 'wp_dashboard_quick_press_last_post_id'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_autosave_draft_ids' WHERE meta_key = 'wp_autosave_draft_ids'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_metaboxorder_post' WHERE meta_key = 'wp_metaboxorder_post'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_usersettings' WHERE meta_key = 'wp_usersettings'; UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_usersettingstime' WHERE meta_key = 'wp_usersettingstime';
После выполнения запросов вы получите примерно такой отчет:
Этап №4 — Замена префикса в файле wp-config.php
Теперь, когда в таблицах базы данных WordPress все замены произведены, заходим в файл wp-config.php, который находится в корневом каталоге блога, находим там строку
$table_prefix = 'wp_';
и заменяем в ней префикс на новый
$table_prefix = 'NEWPREF_';
Этап №5 — Проверка блога после замены префикса
Теперь запусаем браузер, открываем свой блог и проверяем, что админ без проблем входит в панель управления и там все работает.
Проверяем работоспособность всего блога.
Этап №6 — Проверка блога после удаления старых таблиц
Если на Этапе №5 все было в порядке, то снова заходим в phpMyAdmin, выбираем нужную нам базу и теперь уже можно удалить все таблицы со старым префиксом.
Напоследок еще раз для подстраховки выполняем проверку, как на Этапе №5. И если обнаружится какая-то проблема, то придется восстановить из бэкапа таблицы со старым префиксом и вернуть на место прежнее значение префикса в конфигурационном файле wp-config.php ( строка $table_prefix = ‘wp_’; ), который находится в корневом каталоге блога.
Удачной Вам замены префиксов таблиц базы данных WordPress.
Метки: WordPress, база данных, безопасность, префикс
А не проще будет открыть файл базы данных в AkelPad и заменить wp_ на NEWPREF_ ?
Можно и так конечно, для тех, кто знает что делает.
Но мне уже приходилось помогать реанимировать БД, отредактированные в стандартном Notepad.exe и потом импортированные обратно. Основная ошибка у многих новичков в том, что они не обращают внимание на кодировку символов, которая выставлена в настройках БД, к примеру сохраняют в ANSI и заливают в БД, которая настроена под UTF-8, а потом у них либо что-то не работает, либо нечитаемые тексты на выходе.
Огромное спасибо! ))) Я сразу поставил в AkelPad кодировку по умолчанию -UTF-8
спасибо за статью,
после самостоятельной смены префикса возникли проблемы — было не войти в админку. сделал по вашей инструкции — работает.
А у меня печалька вышла. Все делал четко по инструкции. Сначала показалось, что все окей. Но когда попытался добавить новую запись в блог, увидел вместо кнопки «Опубликовать» кнопку «Отправить на утверждение», хотя я имею права администратора…
Wordpress 3.3.1
Что теперь делать, пока не знаю, гугл пока не особо помогает, а префикс сменить очень надо.
Владислав, вероятно Вы пропустили «Этап №3 — Замена упоминаний префикса в записях таблиц» или он выполнен с ошибками. Если же нет, то восстановите из бэкапа вашу БД, затем повторите все действия по смене префикса заново, но перед этим обязательно отключите все плагины.
После смены префикса проверьте работу блога, и если все ок, то включайте поочередно плагины.
Спасибо за столь скорый ответ. Без третьего этапа я пробовал сам, пока не наткнулся на вашу статью. При таком варианте даже в админку не зайти, так что Этап №3 я точно не пропускал :) Сейчас попробовал по новой, как вы сказали, все плагины отключил — тот же самый результат, новую запись не добавить :(
Владислав, предполагаю, что возможно в ваших таблицах (особенно в таблице «wp_user_roles») еще остались записи со ссылками на старый префикс «wp_». Попробуйте зайти в phpMyAdmin и выполнить поиск по БД (во всех таблицах) на предмет наличия подстроки «wp_». Если найдутся, то подкорректируйте их вручную, не забыв при этом заранее записать себе куда-нибудь что и где вы меняли, т.к. не факт, что все, что начинается с «wp_» обязательно менять.
Кстати, проанализировать таблицы можно и без доступа к БД, т.е. в файлах .sql, предварительно сделав временный бэкап (экспорт в файлы .SQL) таблиц или всей БД после замены префикса по инструкции.
Да, и еще, перед проверкой после замены префикса не помешает почистить кэш браузера и кэш блога на хостинге (если у Вас есть конечно доступ к кэшу).
Ради эксперимента заменил «wp_» на новый префикс во всех строках БД, где искомое встречалось — заработало. Но я полагаю, и вы тоже подметили, что менять все — не есть хорошо. Как вариант, установлю по новой WP но при установке укажу другой префикс, там уже в БД будет видно, где можно менять «wp_», а где не стоит этого делать.
Благодарю за внимание.
Как вариант, согласен с вашим решением. После установки «с нуля» с измененным префиксом ради интереса запустите поиск по БД на предмет наличия «wp_», и если найдутся совпадения, то будет понятно, где менять подстроку не стоит.
Вы знаете, сначала я решил сделать вариант по проще, сделал замену префикса по другой, зарубежной инструкции:
tdot-blog.com/wordpress/6-simple-steps-to-change-your-table-prefix-in-wordpress
Все ок, только там не все значения указаны из таблицы «wp_usermeta», я заменил префикс во всех значениях, как указано в вашей инструкции, надеюсь это было правильным решением )
Существенное отличие в зарубежной инструкции — это изменение в таблице wp_options… В столбце options_name следует заменить wp_user_roles на НОВЫЙ-ПРЕФИКС_user_roles. Из-за этого, недостающего в вашей инструкции, момента у меня и были проблемы, судя по всему.
Извиняюсь, вы про wp_options писали. Я просто делал все позавчера, а сегодня был не внимателен. В таком случае даже не знаю, что пошло не так и почему сейчас все ок. Позавчера я делал все четко и про wp_options не забыл :) В любом случае спасибо вам за эту статью ;)
Сейчас вот слил базы 4 в одну. Префикс поменял очень просто! Сделал дамп базы, открыл в блокноте и произвел замену wp_ на 1234wp_ вот вам самая простая инструкция! Все работает все отлично! (Единственное что в моем случае был интернет магазин WooComerce и пришлось миниатюры поменять, в остальном все отлично. Видимо особенность плагина). Ваша инструкция больше поучительная как работать с phpmyadmin.
Ну как кому, а мне так лучше делать все в БД через phpmyadmin, потому что там видишь конкретно что и где меняешь или еще что-то делаешь, заодно и практикуешься в работе с MySQL-запросами и так далее. Вон некоторые новички могут вообще напортачить когда правят в тексте, например не в той кодировке файл сохранят, пунктуацию нарушат или еще чего, а потом мучаются. Но конечно же полюбому перед работой с БД обязательно нужно экспортировать (делать бэкап) или конкретных таблиц, в которых что-то изменяешь, или вообще всю БД целиком для большей надежности.
Заменял префиксы таблиц WordPress при помощи кнопочки в плагине Better WP Security… Пришлось пережить пару неприятных минут, любуясь сначала на «Циклическая ссылка», потом «504 ошибка», потом «Добро пожаловать в знаменитую пятиминутную установку WordPress» :)
Плагин в базе данных префикс поменял, а в wp-config.php — нет. Пришлось ручками через ftp
А вы не пробовали использовать вот этот плагин — Better WP Security — он сам всё делает. Но я пока боюсь его запускать, чтобы ничего не сломать.
Better WP Security — хороший и полезный плагин, а бояться ничего не нужно, просто перед установкой чего-то нового сделайте полный бэкап вашего сайта и базы данных. как говорится «вирусов бояться — в интернет не ходить» :)
А почему не сделать ту же самую операцию, но только через CONCAT?
Хотя, как точно сделать я сказать не могу (не владею языком SQL), но я например знаю, что
SELECT CONCAT(‘RENAME TABLE ‘,table_name,’ TO ‘,’ваш_новый_префикс_’,substring_index(table_name,’_’,-15),’;’) AS query_to_run
FROM information_schema.TABLES
WHERE table_schema = ‘ваша БД’
выводит префикс спереди таблицы и до 15 подчёркиваний с конца НЕ отрезает. Тут всего две операции. Ввести эту команду, выбрать обязательно ПОЛНЫЙ ПОКАЗ строк из того, что выдаст MySQL и потом ввести эту выборку в нашу страницу. Вот и всё, таблицы с префиксами.
Да конечно можно использовать и CONCAT, да еще к тому же и CONCAT_WS, но зачем усложнять все?
Чем больше разных операторов в запросах, тем больше вероятность возникновения проблем, связанных с опечатками и прочими ошибками.
Да и как всегда (а если немного подумать)… хех…
Можно этот вывод в том же текстовом редакторе изменить на то, что нужно…
Это всё лучше и быстрее, чем редактировать саму базу данных и проще, чем вышеизложенный (в заметке) вариант.
Вывод получается таким:
RENAME TABLE oldpref_rules_config TO newpref_oldpref_rules_config;
RENAME TABLE oldpref_rules_dependencies TO newpref_oldpref_rules_dependencies;
RENAME TABLE oldpref_rules_tags TO newpref_oldpref_rules_tags;
RENAME TABLE oldpref_rules_trigger newpref_oldpref_rules_trigger;
RENAME TABLE oldpref_semaphore TO newpref_oldpref_semaphore;
RENAME TABLE oldpref_sequences TO newpref_oldpref_sequences;
копируем этот вывод в любой текстовой редактор. Найти newpref_oldpref_ Заменить на superpref_ и всё… дальше полученное вставляем в SQL поле PhpMyAdmin и наша задача решена без всяких сложностей и хлопот…
Может и такой вариант пригодиться (я правда не проверял), но для большинства начинающих вебмастеров это может показаться не совсем внятным и излишне сложным, да к тому же такой вариант может не срабатывать из-за не совсем стандартной конфигурации БД на сервере MySQL и ее версии.