3 золотых правила безопасности кода для разработчика плагинов и тем WordPress
Сегодня я расскажу вам 3 золотых правила безопасности кода для разработчика плагинов и тем WordPress.
Запомните!
Данные должны быть:
1) очищены,
2) экранированы,
3) проверены!
Когда вы включаете вызовы POST/GET/REQUEST/FILE в свой плагин, важно очистить, проверить и экранировать их.
Цель этого в том, чтобы предотвратить случайную отправку пользователем мусорных данных в систему, а также защитить данные от потенциальных проблем безопасности.
- Очистка: данные, которые вводятся (либо пользователем, либо автоматически), должны быть очищены (санированы) как можно скорее. Это уменьшает вероятность уязвимостей XSS и атак MITM, с помощью которых публикуемые данные могут скомпрометировать безопасность сайта.
- Проверка: все данные должны быть проверены, несмотря ни на что. Даже когда вы проводите очистку, помните, что вы не хотите, чтобы кто-то вставлял «@», когда единственными допустимыми значениями являются числа.
- Экранирование: данные, которые выводятся, должны быть экранированы должным образом при выводе функцией echo таким образом, что они не смогут захватить экраны администратора. Есть много функций esc_*(), которые вы можете использовать, чтобы убедиться, что вы не показываете людям неправильные данные.
Чтобы помочь вам в этом, WordPress поставляется с рядом функций очистки и экранирования. Вы можете прочитать о них здесь:
https://developer.wordpress.org/plugins/security/securing-input/
https://developer.wordpress.org/plugins/security/securing-output/
Помните: вы должны использовать наиболее подходящие для контекста (данной ситуации) функции. Если вы проводите очистку электронной почты, используйте sanitize_email(), если вы выводите HTML, используйте esc_html(), и так далее.
Используйте легкую для запоминания мантру:
Раньше очищай!
Позже экранируй!
Всегда проверяй!
Очистите все, проверьте все, экранируйте все, и никогда не доверяйте пользователям, чтобы всегда иметь данные со входа в порядке.
В конце концов, пользователи приходят из всех слоев общества.
Пример из одного плагина:
1 2 | limit-excerpt/includes/class-limit-excerpt-settings.php:233: $current_section = $_GET['tab']; limit-excerpt/includes/class-limit-excerpt-settings.php:305: $tab .= $_GET['tab']; |
Не используйте функции esc_ для очистки
При очистке данных важно использовать функции очистки, а не функции экранирования. Они работают вместе, но не взаимозаменяемы.
Такие функции, как esc_attr(), ничего не очищают и никогда не должны использоваться для этой цели.
Единственным исключением из этого правила являются URL-адреса, для которых могут использоваться esc_url() или esc_url_raw() при сохранении.
Пожалуйста, просмотрите этот документ для помощи в поиске наиболее подходящих функций очистки:
https://developer.wordpress.org/plugins/security/securing-input/
Пример из одного плагина:
1 | update_post_meta( $post_id, $field ['id'], $this->validate_field ($_REQUEST[ $field ['id'] ], $field ['type'] ); |
В нем неправильно используются функции esc_:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public function validate_field( $data = '', $type = 'text' ) { switch ( $type ) { case 'text': $data = esc_attr( $data ); break; case 'url': $data = esc_url( $data ); break; case 'email': $data = is_email( $data ); break; } } |
Вот и все, на этом статья завершена. Ставьте оценку, пишите комментарий. Пока!