Как обезопасить свой сайт WordPress

Это увеличение непослушного поведения, однако, побудило разработчиков написать лучший код, и поставщики фректов внедрили множество функций, которые помогут программистам в их борьбе с темной стороной.

Дальнейшее чтение на SmashingMag:

Поскольку проверка данных и дезинфекция являются важной частью как гарантий безопасности, так и нормальной обработки пользовательских ввода, обеспечивая безопасность нашего кода, мы будем не только защищать наши спины, но и предлагать более качественный, более надежный пользовательский опыт.

securityimage

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

Эксплуатация на основе URL

С URL-подвиги, хакеры пытаются найти слабые места на вашем сайте, делая запросы, которые, как правило, вернуть ошибку, но по некоторым причинам завершены.

http://mysite.com/trying/to/exploit/%2F/config

Выше гипотетический URL по существу удар в темноте хакера. Но если запрос будет выполнен, даже если URL явно не предназначен, чтобы пойти в любом месте, хакер может быть в состоянии использовать его.

Использование .htaccess в качестве брандмауэра

Один из лучших методов, которые я нашел против такого рода угрозы является .htaccess брандмауэра. Он в основном состоит из правил, которые автоматически блокируют запросы на основе строк в URL.

Например, нет веских причин для открытия кронштейна ( [ ) быть в URL. Если запрос сделан с помощью URL-адреса, содержащего кронштейн, то либо пользователь что-то неправильно впечатл, либо кто-то ищет дыру в безопасности. В любом случае, создание “403 Запрещено” страница является хорошей практикой в этом случае.


RedirectMatch 403 [

Вставьте строку выше в файл .htaccess, чтобы заблокировать любой запрос, содержащий кронштейн отверстия.

Чтобы обезостереть не только скобки, вам понадобится более сложный набор правил. К счастью, наш удивительный редактор Джефф Старр изо всех лет пытался создать большой .htaccess ruleset. Последняя итерация называется 5G Firewall и находится в свободном доступе от скоропортящихся Пресс для вашего копирования и вставки удовольствие.

Брандмауэр является модульным, так что вы можете удалить строки из него, не нарушая функциональность. Если что-то пойдет не так, когда вы используете его, обычно можно отследить проблему, удаляя линии, пока она не начнет работать снова. После того как вы нашли обидеть линии, вы можете удалить его и вставить обратно остальные.

Защита каталогов

На многих серверах можно просмотреть содержимое каталога, просто введя его в панели URL.

http://myblog.com/wp-content/uploads/2011/08/

Посещение этого типичного URL для блога WordPress будет список содержимого этого каталога, показывая все загрузки с августа 2011 года. Вы можете захотеть этого, но вы также можете отключить или настроить его с помощью хорошего файла OL ‘.htaccess.


Options -Indexes

Выталкивание приведенной выше строки в файл .htaccess откажет сярпады каталогов; таким образом, пользователи получат сообщение “403 Запрещено”, если они попытаются просмотреть каталог. Хотя многие люди, кажется, знают об этом, гораздо меньше знают о других вариантах, кроме разрешения или отказа в доступе. Вы можете контролировать, какие типы файлов перечислены с помощью IndexIgnore директивы. Возьмем три примера:


IndexIgnore *
IndexIgnore *.php 
indexIgnore *.jpg *.gif *.png

Если список каталогов включен, то каталог будет отображаться в первом примере, но файлы не будут перечислены, потому что все будут проигнорированы. Второй пример будет перечислять все файлы, кроме файлов с расширением .php. В третьем примере будут опущены три указанных типа изображения.

Обратите внимание, что некоторые хосты (например, MediaTemple) отменяют просмотр каталога по умолчанию, поэтому вам не нужно будет изменять файл .htaccess. Чтобы проверить это, просто введите местоположение каталога в панели URL и посмотрите, что произойдет.

Дополнительная защита уровня сервера

До сих пор принятые меры не имеют ничего общего с фактическим кодом нашего сайта. Как бы ни был защищен ваш код, вам все равно нужно будет реализовать что-то вроде того, что мы сделали выше. У нас нет времени, чтобы посмотреть на все советы и приемы для .htaccess, но вы можете сделать немало других вещей:

  • Каталоги защиты паролей,
  • Используйте интеллектуальные перенаправления,
  • Запретить доступ на основе IP или диапазона IP,
  • Силовая загрузка файлов,
  • Отключить горячую ссылку,
  • Список можно далее.

Посмотрите на раздел “Дальнейшее чтение” в конце этой статьи, и стать хорошими друзьями с вашим файлом .htaccess. Это может показаться сложной и запутанной на первый, но твердые знания о том, как использовать его будет идти долгий путь.

Защита от вредоносных пользователей

Второй тип проблемы, которая может возникнуть, когда кто-то выполняет действие, которое они не должны делать. Это не обязательно означает, что они намеревались нанести вред веб-сайту, но это может произойти.

Если пользователи перечислены где-то в части админ вашего веб-сайта, есть вероятность, что ссылка отображается для удаления каждого пользователя. Ссылка может указать на сценарий в следующем месте:

http://mysite.com/admin/scripts/delete_user.php?user_id=5

Эта связь является относительно неясным; то есть, нормальный пользователь не имеет хороший шанс наткнуться на него. Но если каталог списки включены, то кто-то озорной может http://mysite.com/admin/scripts/ пойти, увидеть, что у вас есть delete’user.php файл там, и сделать различные запросы, чтобы попытаться удалить пользователя.

Если скрипт не проверяет разрешение или намерение, то любой, кто посещает ссылку выше, может удалить пользователя 5.

Власть и намерения

Всякий раз, когда пользователь инициирует действие, мы должны принимать во внимание две вещи. Имеет ли пользователь право выполнять действие (т.е. есть ли у него разрешение)? Если пользователь имеет полномочия, они также намерены завершить действие (т.е. они имеют в виду делать то, что они делают)?

WordPress имеет функции, которые помогут вам убедиться, что оба условия выполнены до действия в сценарии срабатывает. Мы рассмотрим их подробно в ближайшее время. Если вы строите свой веб-сайт с нуля, то вам нужно убедиться, что каждый пользователь имеет связанные разрешения и что вы знаете, какие действия могут быть выполнены при каких условиях.

Например, возможно, вы хотите, чтобы только администраторы могли удалять содержимое с веб-сайта. Каждый раз, когда пользователь пытается удалить содержимое, вы должны убедиться, что они на самом деле администратор – это “авторитет” часть.

Намерение лучше всего описать на примере. Предположим, что вы можете использовать следующую ссылку, чтобы удалить комментарий:

http://mysite.com/admin/scripts/delete_comment.php?comment_id=5

Сам скрипт будет проверять, что пользователь в настоящее время входит в систему и является администратором, поэтому он заботится о проверке полномочий. Может ли кто-то еще сеять хаос? Конечно, они могли бы! Подлый хакер может поставить ссылку на свой собственный веб-сайт, указывая на то же место:

<a href=“http://mysite.com/admin/scripts/delete_comment.php?comment_id=5">Super-Happy Times Here!</a>

Потому что каждый любит супер-счастливые времена, многие пользователи будут нажимать на ссылку. В 99% случаев, ничего не произойдет, потому что эти посетители не будут администраторами mysite.com . Но если зарегистрированный администратор mysite.com сделал нажмите на ссылку, то действие будет выполняться, даже если ссылка была на самом деле нажал от vilehackerperson.com .

Вы можете подумать, что шансы на это происходит астрономические. В некотором смысле вы были бы правы, но помните, что хакер может сделать это очень легко и может автоматизировать его. Миллионы людей получают спам-письма говорят, что Билл Гейтс будет забрать Интернет, если они платят $ 1000. Большинство получателей не видят электронную почту или выбросить его или пометить его как спам или то, что у вас, но, возможно, 1 из каждых 2 миллионов человек заманили дюйма Тысяча баксов в основном ничего не делать не плохо на всех. И хакер, вероятно, не будет ставить ссылку на свой собственный веб-сайт; Все, что им нужно будет сделать, это взломать большой веб-сайт и вставлять ссылку там, никто не замечая.

Проверка на авторитет в WordPress

WordPress имеет систему разрешений, построенную в названии“Роли и разрешения”. Возможности являются основой всей системы; роли просто способ сгруппировать набор возможностей вместе.

Если пользователь имеет delete_posts возможность, то он имеет право удалять публикации. Если пользователь имеет edit_posts возможность, то они могут отодвить свои публикации. Довольно много возможностей доступны, и вы даже можете создать свой собственный.

Роли в основном группы возможностей. Пользователь с ролью “вкладчика” имеет три возможности: read delete_posts , и edit_posts . Они дают пользователю право читать сообщения и отсчитывать или удалять свои собственные публикации. Эти возможности могут быть предоставлены индивидуально любому пользователю, но группировка их в часто используемые пакеты гораздо проще и практичнее.

Имея это в виду, давайте посмотрим, как использовать функции WordPress для обеспечения того, чтобы пользователь имеет право завершить действие, которое они инициируют.


if(current_user_can("delete_users")) {
    wp_delete_user(5);
}
else {
    die("You naughty, naughty person. Of course, you could just be logged out…");
}

Здесь мы позаботились о том, чтобы пользователь мог delete_users выполнить действие. Не делайте преждевременных предположений при защите скриптов; во многих случаях, особенно у власти, намерение не является злонамеренным.

current_user_can()Функция принимает один аргумент, который может быть роль или разрешение. Мы могли бы позволить “редакторам” (которые обычно не имеют delete_users возможности) удалять пользователей следующим образом:


if(current_user_can("editor")) {
    wp_delete_user(5);
}
else {
    die("You must be an editor to delete a user");
}

Будьте осторожны с методом выше, потому что роли не являются инклюзивными. Эта функция не требует, чтобы пользователь был по крайней мере редактором; он требует, чтобы они были именно редактором (если это имеет смысл). Из-за этого я считаю предпочтительным использовать возможности, особенно если я сильно изменил разрешения по умолчанию.

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


if(user_can(5, "manage_links")) {
    echo "User 5 is allowed to manage links";
}
else {
    echo "Sadness! User 5 may not manage links";
}
if(author_can(1879, "update_themes")) {
    echo "The author of post #1879 is allowed to update themes";
}
else {
    echo "Oh noes, our friend, the author of post #1879 may not update themes";
}

user_can()Функция проверяет, имеет ли данный пользователь заданную возможность (или роль). Первым аргументом является идентификатор пользователя или объект пользователя; второй аргумент — это название возможности или роли, которые мы хотим проверить.

author_can()Функция проверяет, имеет ли автор данной должности данную возможность (или роль). Первым параметром должен быть идентификатор должности или объект публикации; во-вторых, это возможность или роль, которые мы рассматриваем.

Проверка на намерение в WordPress

Намерение немного сложнее проверить. В хорошие пр ‘дней, проверка $_SERVER[‘HTTP_REFERER’] была путь. В этом сохранена страница, с которого пришел пользователь. Если доменное имя было их собственным, то пользователь, вероятно, ок … если, конечно, кто-то не попал в их файлы и не вставил ссылку, которая удалила базу данных пользователя, если они нажали на нее в качестве администратора.

Новый более безопасный метод был реализован в WordPress 2.03 – довольно давно – называется nonces. Нонс означает “число, используемое один раз” и часто используется в криптографии для обеспечения безопасности связи. Это число, которое генерируется до инициализания действия, затем прикрепляется к вызову действия, а затем проверяется до завершения действия.

В WordPress, как правило, использовать nonces в одном из двух мест: формы и нормальные ссылки. Давайте сначала посмотрим, как создать nonce в форме.

Несты в формах


<form id="myform" method="post" action="myawesomescript.php">
    <h2>Enter an awesome word here</h2>
    <input type='text' name='word'>
    <?php wp_nonce_field( 'awesome_name_nonce') ?>
</form>

Это позволит создать скрытое поле ввода, содержащее генерируемый nonce, которое будет отправлено вместе со всеми другими данными формы. wp_nonce_fieldФункция занимает четыре параметра:

  1. Первый параметр является необязательным, но рекомендуется, потому что он дает nonce уникальный идентификатор.
  2. Вторым параметром является название поля. Это также неявляется и по умолчанию _wpnonce .
  3. Третий параметр – булеан. Если true установлено, он также отправит реферер для проверки.
  4. Четвертый параметр также булеан и контролирует ли поле эхом прямо тогда и там.

В результате скрытое поле будет выглядеть примерно так:


<input type="hidden" id="_wpnonce" name="_wpnonce" value="d6d71w4664">

Установка все это не будет иметь огромное значение, если он не используется, когда форма на самом деле обрабатывается. Мы должны проверить наличие и значение nonce, прежде чем позволить какие-либо действия, которые будут выполнены. Вот один из способов сделать это:


if (!wp_verify_nonce($_POST['_wpnonce'],'awesome_name_nonce') ) {
   die('Oops, your nonce didn't verify. So there.');
}
else {
   awesome_word_inserter($_POST["word"]);
}

Здесь мы использовали wp_verify_nonce() функцию, чтобы убедиться, что наш nonce является правильным. Эта функция занимает два параметра: первый — значение поля nonce, а второй — название действия, которое мы определили (это был первый параметр для wp_nonce_field() функции). Если nonce проверен, то функция true вернется; в противном случае, он false вернется.

В некоторых случаях вам потребуется ссылка, а не форма, для выполнения действия. Это обычно выглядит как наши предыдущие примеры:

http://mysite.com/admin/scripts/deletethatthing.php?thing_id=231

Для создания nonce для ссылки, мы можем использовать следующий метод:


$base_url = "http://mysite.com/admin/scripts/deletethatthing.php?thing_id=231";
$nonce_url = wp_nonce_url( $base_url, "thingdeleter_nonce");
echo "<a href='".$nonce_url."'>Delete that thing</a>";

В результате ссылка будет что-то вроде этого:

http://mysite.com/admin/scripts/deletethatthing.php?thing_id=231&_wpnonce=d6f77f1364

Когда мы на самом деле перейти к сценарию, мы можем проверить nonce с помощью того же метода, как и раньше:


if (!wp_verify_nonce($_GET['_wpnonce'],'thingdeleter_nonce') ) {
   die('Oops, your nonce didn't verify. So there.');
}
else {
   delete_that_thing($_GET["thing_id"]);
}

Проверка органа и намерения в то же время

Мы должны смотреть на оба аспекта одновременно; хотя, теперь, когда мы рассмотрели все компоненты, это точно не будет ракетостроение! Давайте возьмем простую ссылку, которая позволяет пользователю удалить комментарий. Мы хотели бы это на странице, которая перечисляет комментарии:


$nonce_url = wp_nonce_url("http://mysite.com/scripts/delete_comment.php?comment_id=1451", "delete_comment_nonce");
echo "<a href='".$nonce_url."'>dispose of this comment</a>";

А вот и сам сценарий:


if (wp_verify_nonce($_GET['_wpnonce'],'delete_comment_nonce') AND current_user_can("edit_comment")) {
   wp_delete_comment($_GET["comment_id"]);
}
else {
   die('Oops, your nonce didn't verify, or you are not permission-endowed enough.');
}

Безопасность данных

Наша работа может показаться, что сделано, но если вы разрабатываете на некоторое время, то вы знаете, что никогда не бывает. Необходимо добавить дополнительный уровень безопасности, чтобы остановить проникновение небезопасных данных (или ошибочных данных) в нашу базу данных. Добавление этого дополнительного слоя называется дезинфекцией данных.

Быстрое уточнение: дезинфекция данных относится к процессу очистки наших данных, чтобы убедиться, что ничего подозрительного не отправляется в базу данных. Проверка относится ко всем проверкам, которые мы проводим на данных, чтобы убедиться, что они являются типами данных, которые нам нужны; это обычно делается для того, чтобы пользователь ввел действительный адрес электронной почты, хорошо сформированный URL и т.д. Эти два термина иногда используются взаимозаменяемы, и другие методы могут быть похожи, но они совершенно разные вещи. Для наших целей, санитаризация немного более важно, потому что она имеет больше общего с безопасностью.

Главное, от чего мы пытаемся защититься, это инъекция СЗЛ. Инъекция S’L — это метод, используемый хакерами для использования слабых мест базы данных. Возьмем следующий пример:


// A hacker goes to your search field and searches for elephant' - note the apostrophe at the end. In the script, the following SQL is run:
SELECT ID, post_title FROM wp_posts WHERE post_title LIKE '%elephant'%'

В приведенном выше примере поиск пользователя elephant’ привел к незакрытым кавычкам в скрипте. Хотя хакер не может быть в состоянии сделать многое с этим, сообщение об ошибке будет создано, указывая им, что по крайней мере вы не дезинфицировать ваши данные.

В некоторых случаях, сам S’L может быть вредным или может дать хакеру гораздо больше информации, чем вы хотите. Возьмем, к примеру, администратор может ввести имя входа в систему пользователя в форме и получить обратно адрес электронной почты пользователя.


SELECT user_email FROM wp_users WHERE user_login = 'danielp'

Если хакеру удастся выполнить инъекционную атаку, он может ввести ’ OR 1=1 ‘ форму, что приведет к следующему запросу:


SELECT user_email FROM wp_users WHERE user_login = ’ OR 1=1 ’

Это позволит вернуть все адреса электронной почты в базе данных, потому что мы будем получать все адреса, для которых имя входа пользователя является пустой строки, или 1=1 , который всегда true .

Существует два способа защиты от такого рода проблем – реализация и того, и другого является хорошей практикой. В первом раунде мы проверяем данные. Если необходимо ввести адрес электронной почты, мы можем отфильтровать данные пользователей, которые не соответствуют формату адресов электронной почты. Мы просто следим за тем, чтобы формат был правильным, в противном случае мы перенаправляем пользователя, заявляя, что адрес недействителен. Если данные проходят первый раунд, мы переходим ко второму раунду, где удаляем все символы, которые могут испортить запрос. Это обычно влечет за собой побег котировок, так что они могут быть использованы только в качестве фактических котировок в запросе S’L.

При работе без фреймворка, как правило, использовать addslashes() или что-то подобное, но WordPress предлагает свое собственное решение …

Дезинфекция данных в WordPress

При общении с базой данных в WordPress, предпочтительным методом является использование $wpdb класса. Вы можете прочитать все об этом в “WordPress Основы: Взаимодействие с WordPress базы данных.” Класс предлагает ряд методов, чтобы облегчить ваши заботы о инъекциях.

Прежде чем войти, давайте рассмотрим некоторые примеры, чтобы получить базовое представление о том, как работает класс.


// Perform any query
$wpdb->query("DELETE FROM wp_users WHERE user_id = 5");
// Get one column of data
$posts = $wpdb->get_col("SELECT post_title FROM wp_posts WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT 0,10");
// Get a row of data
$post = $wpdb->get_row("SELECT * FROM wp_posts WHERE ID = 1453");
// Get multiple rows and columns
$posts = $wpdb->get_results("SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'publish' ORDER BY post_date DESC LIMIT 0, 12 ");
// Get a single value 
$author_id = $wpdb->get_var("SELECT post_author FROM wp_posts WHERE ID = 2563");
// Insert a record
$wpdb->insert("wp_postmeta", array("post_id" => 2323,  "meta_key" => "favorite_count", "meta_value" => 224 ), array("%d", "%s", "%d"));
// Update a record
$wpdb->update("wp_postmeta", array("meta_value" => 225), array("meta_key" => "favorite_count", "post_id" => 2323), array("%d"), array("%s", "%d"));

И insert() update() методы являются помощником методы, и они велики, потому что, помимо модульной базы данных взаимодействий немного, они также заботиться о дезинфекции для вас. Если вы хотите использовать общий query() метод, однако, вам нужно будет заботиться о нем по своему усмотрению.

Проще всего просто использовать escape() метод:


$data = $wpdb->escape($_POST[about_me]);
$wpdb->query("UPDATE wp_usermeta SET meta_value = '$data' WHERE meta_key = 'description' AND user_id = 154  ");

Немного сложнее, но лучший способ идти об этом заключается в использовании prepare() метода. Пример из Кодекса WordPress прекрасно иллюстрирует это:


$metakey = "Harriet's Adages";
$metavalue  = "WordPress' database interface is like Sunday Morning: Easy.";
$wpdb->query( $wpdb->prepare( 
   "
      INSERT INTO $wpdb->postmeta
      ( post_id, meta_key, meta_value )
      VALUES ( %d, %s, %s )
   ", 
        10, 
   $metakey, 
   $metavalue 
) );

Дополнительная защита с использованием санитизации

Санитизация является довольно большой темой и требует довольно много времени, чтобы освоить. На данный момент, вы будете заняты в основном определения, какие символы, чтобы позволить, а какие запретить, а затем найти способы разобрать последний. Некоторые общие потребности состоит в том, чтобы разобрать HTML из адресов, отфильтровать номера из строк, проверить адреса электронной почты и так далее, но вам нужно будет реализовать свои собственные решения для более сложных потребностей. Подробнее об этой теме читайте в разделе “Дальнейшее чтение”.

Заключительные мысли

Меры, необходимые для обеспечения безопасности веб-сайта, не могут обсуждаться в одной книге, не говоря уже о плохой статье. Есть много методов и тем, которые мы не смотрели, такие как расширенное шифрование паролей, соли и так далее. Но, надеюсь, реализуя то, что мы обсуждали, ваш сайт будет гораздо безопаснее. Хакеры обычно идут на самое слабое звено, так что если ваш сайт не безумно популярен и довольно безопасно, вы должны быть в порядке.

Хотя у меня есть большой опыт в этой области, я далек от того, чтобы быть экспертом по безопасности. Если вы знаете о каких-либо других или лучших методов, поделиться ими в комментариях. Существует всегда что-то новое, чтобы узнать о безопасности веб-сайта.

Общее чтение

WordPress-Специфическое чтение

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: