Security should be at the forefront of the mind when building WordPress plugins. WordPress plugins are often a prime target for attackers because of their widespread use and potential access to sensitive data. A single vulnerability in a plugin can compromise an entire website, leading to data breaches, defacement, or other severe impacts. A secure plugin keeps users’ data safe and protects against common attacks, ensuring a reliable and trustworthy experience. Below, we’ll walk through some essential best practices for creating secure WordPress plugins, and I’ll share some practical examples.

1. Utilize Nonces para segurança de formulários e URLs
Nonces are vital to protect against Cross-Site Request Forgery (CSRF) attacks. They help verify the authenticity of requests, especially for forms and URLs that carry out sensitive operations. Whenever you create a form or URL, generate a nonce using WordPress’s wp_nonce_field() or wp_create_nonce(). On the server side, you should validate the nonce with check_admin_referer() or check_ajax_referer().
if (isset($_POST['my_nonce']) && wp_verify_nonce($_POST['my_nonce'], 'my_action')) {
// Safe to proceed with action
}
Este tipo de proteção também pode ser aplicado a pedidos AJAX para garantir que são provenientes de utilizadores autorizados:
add_action('wp_ajax_my_secure_action', 'my_secure_ajax_handler');
function my_secure_ajax_handler() {
check_ajax_referer('my_secure_nonce', 'security');
// Trate o pedido
wp_die();
}
2. Limpe e valide as entradas do utilizador
One of the easiest ways for an attacker to compromise your plugin is by injecting malicious data. That’s why sanitizing and validating every user input is critical. WordPress offers several built-in functions to help you do this:
sanitize_text_field()
: Para campos de texto simples.sanitize_email()
: Para endereços de correio eletrónico.esc_url()
: Para URLs.
These functions are great for basic scenarios. However, you can use PHP’s filter_var() for more specific cases. For example, to validate an integer:
$input = filter_var($_POST['user_input'], FILTER_VALIDATE_INT);
if ($input !== false) {
// Input is valid
}
Para cenários mais complexos, como quando precisa de validar entradas de escolha múltipla, considere utilizar a validação personalizada:
$valid_options = ['option_1', 'option_2', 'option_3'];
if (in_array($_POST['selected_option'], $valid_options, true)) {
// Input is valid
}
Isto garante que apenas os valores esperados são processados, reduzindo o risco de problemas inesperados.
3. Saídas de escape
Escaping output is crucial to prevent Cross-Site Scripting (XSS) attacks. Whenever you’re displaying data to users, use WordPress’s escaping functions like:
esc_html()
: Para escapar ao conteúdo HTML.esc_attr()
: Para valores de atributos.esc_url()
: Para URLs.
Eis um exemplo:
echo esc_html($user_input);
Isto impede que código potencialmente perigoso seja executado no browser, mantendo os seus utilizadores seguros.
4. Consultas seguras a bases de dados
Para evitar a injeção de SQL, utilize sempre o $wpdb
class’s prepared statements. Avoid concatenating user inputs directly in SQL queries. Instead, use placeholders:
$results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}my_table WHERE id = %d", $id));
A preparação de instruções garante que as entradas do utilizador são adequadamente escapadas e tratadas como dados e não como código SQL executável.
5. Tratar corretamente as funções e capacidades dos utilizadores
Ao criar funcionalidades que envolvem diferentes níveis de permissões de utilizador, utilize current_user_can() para garantir que apenas os utilizadores com as capacidades adequadas podem executar acções específicas:
se (actual_user_can('manage_options')) {
// Apenas permita que os administradores executem este código
}
Para uma gestão avançada de funções, pode definir capacidades personalizadas e atribuí-las a funções específicas, o que o ajuda a manter um controlo apertado sobre quem pode aceder a partes sensíveis do seu plugin.
6. Proteja-se contra XSS (Cross-Site Scripting)
Os ataques XSS são uma das vulnerabilidades mais comuns que existem. Limpe sempre as entradas do utilizador e escape à saída, como mencionado anteriormente. Se precisar de permitir etiquetas HTML específicas, utilize wp_kses() para as filtrar com segurança:
$allowed_tags = [
'a' => [
'href' => [],
'title' => []
],
'b' => [],
'em' => []
];
$safe_html = wp_kses($user_input, $allowed_tags);
Desta forma, pode permitir alguma formatação básica, mantendo os utilizadores protegidos.
7. Tenha cuidado com o tratamento de ficheiros
Os carregamentos de ficheiros podem ser um enorme risco de segurança se não forem tratados corretamente. Para reduzir estes riscos, permita apenas tipos de ficheiros específicos, verifique os tipos MIME e carregue os ficheiros para uma localização segura:
$allowed_file_types = ['jpg', 'jpeg', 'png', 'pdf'];
$file_type = wp_check_filetype(basename($_FILES['file']['name']));
if (in_array($file_type['ext'], $allowed_file_types)) {
// Proceed with upload
}
Pode utilizar wp_handle_upload()
to safely manage uploads according to WordPress’s guidelines:
$uploaded_file = wp_handle_upload($_FILES['file'], ['test_form' => false]);
if ($uploaded_file && !isset($uploaded_file['error'])) {
// File successfully uploaded
}
It’s also a good practice to limit uploaded files’ size and perform additional security checks, such as virus scanning or verifying file integrity using a hash function.
8. Pedidos AJAX seguros
AJAX is a great way to make your plugin more dynamic, but it’s essential to secure it properly. Make sure all AJAX requests validate a nonce and check user capabilities:
add_action('wp_ajax_my_action', 'my_ajax_handler');
function my_ajax_handler() {
check_ajax_referer('my_nonce', 'security');
se (current_user_can('edit_posts')) {
// Trate o pedido
}
wp_die();
}
Para manter o seu plugin seguro, lembre-se de proteger tanto as acções AJAX autenticadas (wp_ajax_) como as não autenticadas (wp_ajax_nopriv_).
9. Mantenha os dados sensíveis seguros
Nunca codifique dados sensíveis, como chaves de API, diretamente no seu plugin. Em vez disso, armazene-os de forma segura usando a API de opções do WordPress ou em variáveis de ambiente:
update_option('my_plugin_api_key', sanitize_text_field($api_key));
Desta forma, as informações sensíveis permanecem ocultas e menos acessíveis a potenciais atacantes.
10. Siga o princípio do menor privilégio
Dê aos utilizadores e processos apenas as permissões de que necessitam. Se uma tarefa não necessitar de privilégios de administrador, não os utilize. Este princípio ajuda a limitar os danos que uma conta de utilizador comprometida pode causar.
11. Proteja-se contra ataques de força bruta
Os ataques de força bruta são comuns, especialmente nos formulários de início de sessão. Pode utilizar plugins como o Wordfence ou implementar a sua própria função de limitação de taxas:
function limit_login_attempts() {
$ip_address = $_SERVER['REMOTE_ADDR'];
$attempts = get_transient('login_attempts_' . $ip_address);
if ($attempts >= 5) {
wp_die('Too many login attempts. Please try again later.');
}
set_transient('login_attempts_' . $ip_address, $attempts + 1, 60 * 15); // Limit to 5 attempts per 15 minutes
}
add_action('wp_login_failed', 'limit_login_attempts');
Esta estratégia simples pode ajudar a proteger o seu plugin de ataques de força bruta.
12. Registe as acções sensíveis
O registo é essencial para seguir actividades suspeitas. Se um utilizador alterar as definições do plug-in ou falhar demasiadas tentativas de início de sessão, deve registar estes eventos para análise futura:
function log_action($message) {
$log_file = WP_CONTENT_DIR . '/plugin_logs.txt';
$current_time = current_time('mysql');
file_put_contents($log_file, "[$current_time] $message\n", FILE_APPEND);
}
log_action('Plugin settings changed by user ID ' . get_current_user_id());
13. Plug-ins de segurança recomendados
To further enhance your plugin’s security, recommend some widely trusted plugins. Wordfence e Sucuri são óptimas opções. Oferecem funcionalidades como proteção por firewall, verificação de malware e segurança de início de sessão que podem proporcionar uma camada adicional de defesa.
- Wordfence: Firewall de ponto de extremidade e verificação de malware.
- Sucuri: Auditoria de segurança, deteção de malware e proteção DDoS.
Using these alongside your plugin’s built-in security features creates a robust defense system.
14. Integração segura com o WooCommerce
WooCommerce is hugely popular in the US and Europe, so if your plugin integrates, handle all data correctly. Validate and sanitize every input, especially when dealing with orders or payment information. You can also use WooCommerce’s built-in functions to handle payment data securely.
Por exemplo:
$order = wc_get_order($order_id);
se ($order) {
$total = $order->get_total();
// Efectue operações seguras com a encomenda
}
Respect WooCommerce’s security practices and ensure the security of any customer data you handle.
15. Utilize a autenticação multi-fator (MFA)
Ativar a autenticação multi-fator (MFA) é uma excelente forma de adicionar uma camada extra de segurança, especialmente para contas de administrador. Muitos plug-ins, como o Duo ou Google Authenticatorpermitem-lhe adicionar facilmente o MFA à sua instalação do WordPress, dificultando o acesso não autorizado dos atacantes.
16. Localize e teste em diferentes regiões
If you plan to reach an international audience, it’s crucial to localize your plugin and make sure it works in different environments:
- Suporte multilingue: To make your plugin easy to translate, use WordPress’s localization functions, such as __() and _e().
- Tratamento do fuso horário: Certifique-se de que o seu plugin lida corretamente com diferentes fusos horários, especialmente se envolver agendamento.
Testar o seu plugin em diferentes definições de idioma e fusos horários do servidor ajudá-lo-á a garantir a compatibilidade com utilizadores de todo o mundo.
Além disso, garante a conformidade com o RGPD, tratando os dados pessoais de forma responsável, fornecendo opções de consentimento claras e permitindo que os utilizadores eliminem ou exportem os seus dados mediante pedido.
17. Configure o WordPress para obter o máximo de segurança
Para além de proteger o seu plugin, a configuração do WordPress é essencial para uma segurança máxima. Aqui ficam algumas sugestões:
- Restrinja o acesso a ficheiros sensíveis: Utilize .htaccess para restringir o acesso a ficheiros como wp-config.php.
- Desativar a edição de ficheiros: Impeça a edição de ficheiros através do painel de controlo do WordPress, adicionando esta linha ao wp-config.php:
defina('DISALLOW_FILE_EDIT', true);
- Limite as tentativas de início de sessão: Utilize plugins de segurança ou código personalizado para limitar o número de tentativas de início de sessão.
18. Mantenha o WordPress e os plug-ins actualizados
Não é segredo que manter o WordPress, os temas e os plug-ins actualizados é vital para a segurança. As actualizações incluem frequentemente patches de segurança, por isso certifique-se de que tudo está atualizado.
Considere a utilização de fornecedores de alojamento gerido que ofereçam actualizações automáticas para garantir que o seu site permanece seguro.
19. Efectue testes de segurança
Os testes de segurança regulares ajudam a identificar vulnerabilidades antes dos atacantes. Ferramentas como WPScan pode ser benéfico para este fim:
# Exemplo de comando WPScan para verificar se há vulnerabilidades
wpscan --url https://example.com --api-token YOUR_API_TOKEN
Além disso, a realização de revisões de código e de testes de penetração pode ajudá-lo a detetar pontos fracos no código do seu plug-in.
Conclusão
A segurança deve ser sempre considerada ao desenvolver plug-ins do WordPress. Ao seguir estas práticas recomendadas, estará mais bem equipado para proteger o seu plug-in e os seus utilizadores contra ameaças. É um processo contínuo, por isso continue a aprender, mantenha-se atualizado e pense em como tornar o seu plug-in mais seguro.
Desenvolver com uma mentalidade de segurança em primeiro lugar dá-lhe paz de espírito e cria confiança nos seus utilizadores, garantindo que eles podem utilizar o seu plugin com confiança.
Recapitulando:
- Utilize nonces e valide as entradas.
- Proteja as consultas de bases de dados e as saídas de escape.
- Trate os carregamentos de ficheiros com cuidado.
- Proteja os pedidos AJAX.
- Mantenha os dados sensíveis em segurança e siga o princípio do menor privilégio.
- Proteja-se contra ataques de força bruta e registe acções sensíveis.
- Utilize os plug-ins de segurança recomendados e active a MFA.
- Teste para diferentes idiomas, fusos horários e conformidade com o RGPD.
- Actualize regularmente e realize testes de segurança.
Ao implementar estas práticas, está no bom caminho para desenvolver um plugin WordPress seguro e fiável.