HTML-форми. Видалення версії WP

HitmanPro виявляє, ідентифікує та видаляє віруси, шпигунські програми, трояни, руткіти та інші шкідливі програми.

Утиліта використовує власний двигун поведінкового аналізу та експертизи файлового кластера, а також інноваційну хмарну технологію перевірки за допомогою антивірусних баз даних SophosLabs, Kaspersky та Bitdefender. Сканер HitmanPro виявляє та видаляє потенційно шкідливі загрози з мінімальним впливом на продуктивність системи.

* HitmanPro – безкоштовний антивірусний сканер. Функція видалення доступна 30 днів безкоштовно.

Основні можливості HitmanPro

Чи може ваш антивірус упоратися з новітніми загрозами?

Нове джерело шкідливих програм може бути виявлено будь-де, навіть на надійних сайтах. Ці загрози можуть використовувати різні техніки для уникнення антивірусного захисту. HitmanPro розроблений для спільної роботи з антивірусним захистом та використовує глибокий поведінковий аналіз для пошуку та нейтралізації загроз нульового дня – сучасних загроз, які намагаються уникнути виявлення.

Поведінкове виявлення + колективний досвід

Замість використання сигнатурних визначень для розпізнавання шкідливих програм, HitmanPro досліджує поведінку кожного файлу щодо шкідливої ​​активності. Даний підхід дає HitmanPro можливість блокувати нові підступні шкідливі програми та віруси до того, як вони будуть ідентифіковані. HitmanPro також підключається до бази даних шкідливого програмного забезпечення SophosLabs, щоб виявити більше форм нових загроз і відстежити їх шлях до самого джерела.

Без встановлення

HitmanPro займає 12 мегабайт і не потребує встановлення. Програму можна запустити безпосередньо з робочого столу, USB-диска, CD/DVD або віддаленого сховища. Навіть якщо ваш антивірус контролюється шкідливою програмою або шифрувальником, HitmanPro буде працювати коректно і зможе виявляти та видаляти загрози.

Комплексне відновлення

HitmanPro дозволяє видаляти стійкі загрози, що закріпилися в операційній системі, та замінює інфіковані ресурси системи на безпечні оригінальні версії, продовжуючи блокувати спроби повторного зараження.

Нагороди у тестуванні

Передача даних через масив $_SESSION дозволена одноразово, надіслані дані відразу видаляються. Це може стати в нагоді, наприклад, при "поверненні" у форму введених в іншому модулі даних.

Добре, коли всі службові функції об'єднані в один модуль, який підключають основні модулі через директиву require_once . Ми свій модуль службових функцій назвемо function.php і, крім згаданих методів trimall та magic, включимо туди такі функції:

  • read() - читатиме поточну базу і повертатиме масив записів;
  • write($a) - записуватиме масив записів $a у файл;
  • get_index_by_name ($a,$name) - шукатиме на ім'я $name відповідний запис і повертатиме її номер (з нуля) або значення -1, якщо запис не знайдено. Це знадобиться, щоб відрізняти додавання нового запису від редагування існуючого.

Крім того, файл функцій підключить конфігураційний файл і запустить сесію - ці можливості можуть знадобитися будь-якому модулю, який його підключає.

Файл function.php

Зверніть увагу, що функція read додатково фільтрує масив записів від порожніх рядків (про всяк випадок, взагалі-то їх не повинно виникати), а trimall спочатку замінить будь-який непустий ланцюжок розділювачів на один пробіл (друга preg_replace), а потім видалить можливі зайві роздільники в початку і кінці рядка, що залишився (перший preg_replace).

Також є нюанс із функцією read у сенсі сумісності коду. Так як в єдиному її рядку є анонімна функція, передбачається використання PHP версії не нижче 5.3. Якщо треба нижче – замініть код на такий, де функція фільтрації іменована або зовсім не використовується, як тут:

Function read () ( $str=@file_get_contents (FILENAME); $a=explode("\n",$str); return $a; )

Також важливим є коректне приведення рядка в Юнікоді до нижнього регістру (див. mb_strtolower у коді). А локаллю ми тут не користуємось.

Здається, настав час писати основний файл index.php. Він вирішуватиме наступні завдання:

  • виводити форму для додавання нового запису, який обробляє модуль add.php;
  • поряд з формою додавання виведемо додаткові команди - очищення форми "самовизовом" скрипта без параметрів (кнопка тут не підійде, тому що не передає на сервер даних) та посилання для звернення до модуля сортування записів на ім'я sort.php;
  • отримувати від інших модулів результати їх роботи у вигляді числової змінної $status та виводити відповідні повідомлення (масив $status_msg). Значення $status , що дорівнює нулю, буде прийнято за умовчанням, йому відповідає висновок короткої довідки про роботу програми;
  • якщо база непуста, показати її записи та забезпечити перехід до редагування чи видалення.

Щоб не перевантажувати таблицю додатковими кнопками та посиланнями, зробимо клацання по іменіпереходом до редагування запису модулем edit.php , а клацання по полю "Число"буде відповідати видалення запису модулем del.php.

Ось як виглядає при кількох доданих записах:

Зовнішній вигляд скрипта "Міні-БД на текстовому файлі"

Файл index.php

Тепер займемося відсутніми модулями. У add.php, здається, просте завдання - отримати від index.php змінні $name та $number і записати їх у файл. Однак, модуль повинен перевірити, що йому передані непусті дані, а також вміти відрізняти ситуацію, коли введено ім'я, що вже існує в базі, від введення нового запису (див. if ($id>-1) ( ... ) else ( ... ) ) у коді). В останньому випадку запис завжди додається до кінця, адже буде модуль сортування рядків за абеткою.

Також важливо, що рядок $name , "пропущений" через обробник параметрів, вже позбавлений "критичних" для розмітки символів на кшталт ", ",< и >, а в масиві $a , прочитаному з файлу даних, всі рядки лежать "як є", і 123 не буде знайдена, якщо $name після обробки перетворилася 123 . Тому функції пошуку запису, названого нами get_index_by_name, передається рядок, перетворений "назад" до початкового вигляду за допомогою стандартної функції htmlspecialchars_decode (доступна з PHP 5.1). У тому ж вигляді рядок повертається назад до index.php через масив $_SESSION . Це забезпечить деяку зручність роботи - після введення нового запису її дані залишаться у формі і можна буде внести ще один запис, що мало відрізняється по імені ("Іванова" після "Іванів").

Ну а саме повернення з модуля в модуль абсолютно типовий - через стандартну функцію header. Пам'ятайте, що її можна використовувати, тільки якщо модуль ще нічого не виводив у браузер.

Файл add.php

Тепер про редагування воно буде реалізовано в edit.php . Форма редагування - майже така сама, як форма додавання, ми просто полінувалися зробити окрему функцію для виведення форми. Важливіше те, що модуль сам буде обробником даних, переданих через форму редагування, а значить повинен відрізняти ситуацію, коли він тільки викликаний, від тієї, коли користувач натиснув "Зберегти". Останнім завданням є перевірка

If (!empty($_POST["submit"]) && !empty($name) && isset($number) && isset($id)) (

визначальна, чи була натиснута кнопка та передані всі дані. Друга гілка -

Else if (isset($a[$id]))) (

призначена для ситуації, коли в масиві $a є запис, номер якого передано скрипту і він має бути відредагований. Номер запису зберігається у прихованому HTML-полі .

Файл edit.php

Модуль видалення запису del.php буде досить простим, все, що йому знадобиться – отримати допустимий $id запису (номер елемента в масиві $a), прибрати відповідний елемент із масиву, переписати файл та повернутися на сторінку головного модуля.

Файл del.php

Зрештою, модуль сортування sort.php породить нову проблему - як сортувати рядки в Юнікоді за алфавітом, не розрізняючи великих і маленьких букв? "Пряме" сортування за допомогою стандартної функції sort підійде навряд чи - вона вважає малий і прописну букву різними символами. Локаль ми не ставили, тим більше, для її встановлення єдиної форми запису для всіх операційних систем немає .

Обмежимося тим, що з усього різноманіття функцій сортування масивів виберемо usort з функцією користувача порівняння елементів.

Застосовуване "пряме" порівняння односимвольних рядків Юнікоду, здається, не зовсім коректно, але strcmp порівнює рядки побайтово і нам не підійде, а взагалі коректне порівняння будь-якихрядків в Юнікоді – дуже непросте завдання… У мене для російської та англійської в системі все спрацювало, наприклад, після сортування виходили природні порядки слів, такі як

Абба, Авка, авкліт, бася, Бобі, Бобик, бобіка, Бобіна

Файл sort.php

Нам залишається створити в папці файл з ім'ям.htaccess, де ми пропишемо кодуванням за умовчанням Юнікод і вкажемо директиви налаштування лапок для сайту, щоб ...

У цій папці створимо порожній (0 байт) файл data.txt (необов'язково, якщо всі права налаштовані).

Файл.htaccess AddDefaultCharset utf-8 magic_quotes_gpc off php_flag magic_quotes_runtime off php_flag magic_quotes_sybase off

Можете подивитися, що вийшло, і про знайдені проблеми повідомити мене, я написав скрипт дуже оперативно, в 2 прийоми, і міг щось не продумати:)

Колекція корисних сніпетів (кодів). Коди розраховані на часті завдання під час редагування або створення теми.

Як правило, всі ці коди потрібно розміщувати у файлі теми functions.php . Або, можна створити окремий.php файл розмістити код туди і підключити файл до functions.php теми так:

// підключаємо сніпети require_once "functions-snippets.php";

Зовнішній вигляд CSS для TinyMCE редактора

Підключає файл стилів до редактора WordPress TinyMCE. Так ми зможемо налаштувати стилі редактора в адмінці і при редагуванні запису бачити, як вона виглядає у фронт-енді.

// Стилі для TinyMCE редактора // Потрібно створити файл "editor-styles.css" у папці теми add_action("current_screen", "my_theme_add_editor_styles"); function my_theme_add_editor_styles() ( add_editor_style("editor-styles.css"); )

CSS для сторінки входу (login)

## CSS для сторінки входу (login) ## Потрібно створити файл "wp-login.css" у папці теми add_action("login_head", "my_loginCSS"); function my_loginCSS() ( echo ""; )

CSS для адмін-панелі

Підключає файл стилів на всі сторінки адмін панелі. Так, можна зручно переробляти та доповнювати стилі адмінки.

## CSS стилі для адмін-панелі. Потрібно створити файл "wp-admin.css" у папці теми add_action("admin_enqueue_scripts", "my_admin_css", 99); function my_admin_css()( wp_enqueue_style("my-wp-admin", get_template_directory_uri() ."/wp-admin.css"); )

Видалення Адмін-бару з фронт-енду

Адмін бар може заважати коли в темі використовуються фіксовані (плаваючі) блоки. У таких випадках іноді простіше забрати цей бар.

## Видаляє Адмін-бар з фронт-енду add_filter("show_admin_bar", "__return_false"); ## Включаємо підтримку віджетів. Додаємо область для віджетів if(function_exists("register_sidebar"))( register_sidebar(array("before_widget" => "", "after_widget" => "", "before_title" => "", "after_title" => "", ));

Активація підтримки довільного меню

Реєструє область (місце) для меню та включає підтримку меню. Після встановлення цього коду в адмін-панелі з'явиться можливість створювати довільні меню та прикріплювати їх у створені цим кодом області. У шаблоні меню виводиться функцією wp_nav_menu().

## Add custom menus register_nav_menus(array("main" => "Головне меню", "in_footer" => "Меню в підвалі",));

Додаємо посилання на RSS фід записів та фід коментарів у

Настроювана фонова картинка або фон ## Включає можливість встановлювати фонову картинку з адмінки add_theme_support("custom-background");

В результаті код виведе:

body.custom-background ( background-color: #bdd96e; )

Включення шорткодів у віджет «Текст»

Багато плагінів використовують шотрокди, але не у всіх є віджети. У такому разі було б зручно використовувати шорткод плагіна у віджеті «Текст».

## Шорткоди у віджеті "Текст" if(! is_admin())( add_filter("widget_text", "do_shortcode", 11); )

Випадковий текст за промовчанням у полі контенту в адмінці

При створенні нового запису (поста чи сторінки) іноді зручно, щоб там були якісь нотатки, пояснення, як і що потрібно писати. Для цього можна вставляти в контент дефолний текст:

## Випадковий дефолтний текст для редактора add_filter("default_content", "writing_encouragement_func"); function writing_encouragement_func($content) ( global $post_type; // Тексти для редактора, тип запису post if($post_type == "post")( $array = array("Якесь повідомлення", "Якесь повідомлення", ); return $array[ array_rand($array) ] ) // Тексти для редактора, тип запису page else ( $array = array("Якесь повідомлення", "Якесь повідомлення",); return $array[ array_rand($array) ] ) )

Змінити кількість записів на сторінці пошуку

За замовчуванням на сторінці пошуку показується стільки ж записів на сторінці, скільки і скрізь, скільки виставлено в налаштуваннях.

Цей приклад показує, як вивести 100 записів на сторінці.

## зміна обсягу повідомлень на page page - set here to 100 add_action("pre_get_posts", "search_results_per_page_func"); function search_results_per_page_func($query) ( // запит на сторінці пошуку if(! is_admin() && $query->is_main_query() && $query->is_search())( $query->set("posts_per_page", 100); ) return $query;

Визначає, скільки слів має бути в цитаті, яка зазвичай виводиться на архівних сторінках записів (рубрики, мітки). Цитату виводить функція the_excerpt().

## Зміна довжини цитати add_filter("excerpt_length", "custom_excerpt_length_func"); function custom_excerpt_length_func($length) ( return 20; // у слів )

Видалення полів із профілю в адмінці: AIM, Yahoo IM, Jabber ## видаляє з профілю поля: AIM, Yahoo IM, Jabber / Google Talk add_filter("user_contactmethods", "remove_contactmethod"); function remove_contactmethod($contactmethods) ( unset($contactmethods["aim"]); unset($contactmethods["jabber"]); unset($contactmethods["yim"]); return $contactmethods; ) Додавання полів у профіль адмінці: facebook, twitter ## Додає до профілю поля: AIM, Yahoo IM, Jabber / Google Talk add_filter("user_contactmethods", "add_contactmethod"); function add_contactmethod($contactmethods) ( $contactmethods["twitter"] = "Twitter"; $contactmethods["facebook"] = "Facebook"; return $contactmethods; ) Додавання класу has_sidebar до тега , якщо є сайдбар

Для того, щоб цей хак працював, потрібно, щоб у темі в тегу використовувався, як заведено, тег шаблону body_class() .

## Додавання класу `has_sidebar` до тега ``, якщо є сайдбар add_filter("body_class", "has_sidebar_func"); function has_sidebar_func($classes)( if(is_active_sidebar("sidebar"))( // додаємо клас $classes = "has_sidebar"; ) return $classes; )

Додавання віджету в консоль

Іноді може стати в нагоді додати віджет в консоль адмін-панелі, щоб у ньому розмістити важливу інформацію щодо поточної теми.

## Довільний віджет в консолі в адмін-панелі add_action("wp_dashboard_setup", "my_custom_dashboard_widgets"); function my_custom_dashboard_widgets() ( wp_add_dashboard_widget("custom_help_widget", "Нотатки теми", "custom_dashboard_help"); ) function custom_dashboard_help() ( echo "

Ласкаво просимо до теми "Моя тема"! Тут деякі нотатки на тему."; )

Отримаємо такий віджет:

Увімкнення скрипту відповіді на коментар

Цей скрипт пересуває форму коментарів, натиснувши кнопку "Відповісти".

## Підключення скрипта відповіді на коментар add_action("wp_footer", "enable_threaded_comments"); function enable_threaded_comments()( if(is_singular() && comments_open() && get_option("thread_comments")) wp_enqueue_script("comment-reply"); )

Зображення Увімкнення мініатюр запису

За замовчуванням для записів немає блоку, де можна встановити мініатюру запису. Щоб такий блок з'явився, його потрібно увімкнути. Потрібно увімкнути підтримку мініатюр. Робиться це дуже просто:

## Увімкнення мініатюр запису add_theme_support("post-thumbnails"); set_post_thumbnail_size(200, 200, true); // Normal post thumbnails

Створення додаткових проміжних розмірів мініатюр

При завантаженні зображення для неї створюються додаткові розміри мініатюри. До базових розмірів можна легко додати свої – довільні.

## Створення проміжних розмірів мініатюр if(function_exists("add_image_size"))( add_image_size("mysize-horizont", 300, 200, true); add_image_size("mysize-vertical", 400, 500, tru

Щоб отримати зареєстрований розмір, скористайтеся функцією:

Додавання мініатюри до RSS фід

Цей код додає мініатюру запису на початок RSS-фіду.

## Додавання мініатюри до RSS фід add_filter("the_excerpt_rss", "add_thumbnail_to_feed"); //add_filter("the_content_feed", "add_thumbnail_to_feed"); // звичайно цей хук не використовується, але теж може бути... => "margin-right:15px;"); $content = $img ;

Скасовуємо обгортку картинок у тег

У контенті

При виведенні контенту в темі за допомогою the_content() спрацьовує функція wpautop() і в результаті якщо знаходиться на окремому рядку, він обертається в

Тобто. було стало.

Цей приклад показує, як прибрати таку дивну поведінку.

## Відміняємо обгортку картинок у тег `

` у контенті add_filter("the_content", "remove_img_ptags_func"); function remove_img_ptags_func($content)( return preg_replace("/

\s*((?:]+>)?\s* ]+>\s*(?:)?)\s*/i", "\1", $content); ) // Підключення скрипта html5 для IE з cdn add_action("wp_head", "IEhtml5_shim_func"); function IEhtml5_shim_func()( echo ""; // або якщо потрібна ще й підтримка під час друку // echo ""; )

Встановимо максимальну кількість ревізій запису

За замовчуванням кількість ревізій запису необмежено і це може надмірно захаращувати базу даних. Зовсім відключати ревізії теж не найкраще рішення, тому що буває, що при редагуванні запису щось йде не так і внесені дані губляться - робота коту під хвіст.

Ідеально - обмежити кількість ревізій, наприклад до 5:

If(! defined("WP_POST_REVISIONS")) define("WP_POST_REVISIONS", 5);

Визначати константу треба у плагіні чи раніше.

Захист Видалення WP

Потрібно це, щоб хакери не знали версію WP і не могли визначити слабкі місця. Разом із цим кодом потрібно також видалити файл readme.html у корені сайту, тому що в ньому також вказується поточна версія.

## Повне Видалення версії WP ## Також потрібно видалити файл readme.html у корені сайту remove_action("wp_head", "wp_generator"); // із заголовка add_filter("the_generator", "__return_empty_string"); // з фідів та URL

Відключимо виводи помилок на сторінці авторизації

У разі помилки, при введенні логіна або пароля, WP повідомляє, що саме було введено неправильно: логін або пароль. Це дає додаткову інформацію для «підбирачів» паролів.

Відключимо можливість правити файли в адмінці для тем і плагінів

Можливість редагувати файли прямо з адмінки може стати великою діркою у захисті. Давайте її закриємо.

## Відключимо можливість редагувати файли в адмінці для тем, плагінів define("DISALLOW_FILE_EDIT", true);

Закриємо публікацію через xmlrpc.php

За замовчуванням увімкнено можливість публікації записів через файл xmlrpc.php .

Це така можливість публікувати записи з-за, наприклад з пошти... Найчастіше цей функціонал не потрібен і в ньому можуть бути потенційні дірки. Тому його найчастіше бажано відключити. До речі, в ранніх версіях WordPress цей функціонал був вимкнений за умовчанням і його потрібно було включити, щоб ним користуватися.

## закриємо можливість публікації через xmlrpc.php add_filter("xmlrpc_enabled", "__return_false");

При створенні навіть персонального сайту далеко не кожен може передбачити всі можливі способи його подальшого використання. Дуже важливо підготувати ґрунт для подальшого розвитку сайту. Якщо в минулому ви створили сайт і за умовчанням привласнили всі сторінки розширення.html, а тільки потім вирішили використовувати PHP, то читайте далі.

Раніше для використання SSI, назви сторінок сайту мали закінчуватися розширенням.shtml, але сьогодні більшість інтернет-серверів налаштовані так, що SSI можна використовувати і на сторінках з розширенням.html, що дуже зручно. З PHP зовсім інша історія – розширення.php є розширенням за умовчанням. Розробники сайтів, заздалегідь знаючи, що використовуватиметься ця мова програмування, відразу присвоюють правильне розширення.

Але що робити, коли всі сторінки закінчуються розширенням.html?

Замінюємо розширення HTML на PHP

Це можна зробити кількома способами. Найяскравіший спосіб — дати всім сторінкам розширення.php або змінити розширення, що вже існують (.html, .shtml і т.д.). Цей спосіб має недоліки. Наприклад, вже проіндексованим сторінкам з розширенням.html доведеться заново індексуватися пошуковими системами. Або ще гірше - всі зовнішні посилання, які посилаються явно на ту чи іншу сторінку, будуть недійсними. І доведеться сповіщати власників кожного сайту про ці зміни та створювати для кожної сторінки ще одну сторінку із 301 помилкою. Звичайно, змінити одне розширення на інше припустимо, але що робити, якщо сайт вже має багато сторінок і багато посилань на різні сторінки з інших сайтів?

З усвідомленої причини на даний момент всі сторінки цього сайту закінчуються розширенням html, і мені ніяк не хотілося робити наведені вище зміни, тим самим створюючи собі зайві труднощі.

Можна обійтися іншим способом. Якщо сервер, на якому розміщується сайт, підтримує mod_rewrite (у більшості випадків підтримує), і є доступ до файлу.htaccess , то можна додати наступні рядки в цей файл:

RewriteEngine on RewriteRule ^(.*)\.html $1\.php

Додавши цей код в. htaccess можна не хвилюватися. Всі існуючі сторінки з розширенням.html будуть автоматично замінюватися розширенням.php завдяки чудесам від Apache. Але й цей спосіб не єдиний. Можна прописати наступне в тому самому.htaccess файлі:

AddHandler application/x-httpd-php .php .html .htm

На мій погляд, найвдаліший спосіб. Це робить HTML-сторінки рівними PHP-сторінкам, тобто всі функції PHP тепер можна використовувати на сторінках з розширенням HTML. Якщо немає доступу до файлу.htaccess , то можна написати лист хостинг компанії, і ввічливо попросити адмінів прописати конфігурації Apache (httpd.conf) потрібне значення для сайту.

До речі, якщо раніше на сайті використовувалося SSI таким чином:

то тоді в новому PHP'шному стані цей код потрібно замінити на:

Ну от і все, думаю який-небудь із вищенаведених способів допоможе.