Ataki typu SQL Injection i XSS (Cross-Site Scripting) to dwa z najczęściej wykorzystywanych sposobów włamań na strony internetowe oparte na WordPressie.
Choć WordPress sam w sobie jest dobrze zabezpieczony, błędy często pojawiają się w niestandardowym kodzie motywów i wtyczek.
W tym poradniku pokażę, jak samodzielnie zabezpieczyć swoją stronę przed tymi zagrożeniami — bez użycia zewnętrznych wtyczek, tylko za pomocą dobrych praktyk w kodzie PHP i JavaScript.
Czym jest SQL Injection?
Atak SQL Injection polega na wstrzyknięciu złośliwego kodu SQL do zapytania kierowanego do bazy danych.
Najczęściej dzieje się to wtedy, gdy dane od użytkownika (np. z formularza, adresu URL lub cookie) są używane w zapytaniu SQL bez odpowiedniego oczyszczenia (sanityzacji).
Niebezpieczny przykład:
$results = $wpdb->get_results( "SELECT * FROM wp_users WHERE user_login = '" . $_GET['login'] . "'" );
Atakujący może wpisać w adresie URL:
?login=' OR 1=1 --
i w ten sposób uzyskać dostęp do danych wszystkich użytkowników.
Jak zapobiegać SQL Injection w WordPressie
WordPress dostarcza własny obiekt bazy danych $wpdb, który zawiera bezpieczne metody przygotowywania zapytań.
Poprawny, bezpieczny przykład:
$login = sanitize_text_field( $_GET['login'] );
$results = $wpdb->get_results(
$wpdb->prepare( "SELECT * FROM wp_users WHERE user_login = %s", $login )
);
Zasady bezpieczeństwa:
- Używaj zawsze
$wpdb->prepare() do wszystkich zapytań SQL.
- Nie łącz danych wejściowych bezpośrednio z zapytaniem.
- Sanityzuj dane wejściowe za pomocą funkcji WordPressa, np.:
sanitize_text_field()
intval()
esc_sql() (tylko w ostateczności)
Czym jest XSS (Cross-Site Scripting)?
Atak XSS polega na wstrzyknięciu złośliwego kodu JavaScript do strony — np. w komentarzach, formularzach lub niestandardowych polach.
Kod ten może wykradać ciasteczka, przekierowywać użytkownika lub infekować kolejne konta.
Niebezpieczny przykład:
echo $_GET['message'];
Jeśli użytkownik wpisze w URL:
?message=<script>alert('XSS');</script>
skrypt zostanie uruchomiony w przeglądarce innych użytkowników.
Jak zabezpieczyć się przed XSS w WordPressie
WordPress udostępnia zestaw funkcji do filtrowania i oczyszczania danych zarówno przy zapisie, jak i wyświetlaniu treści.
1. Oczyszczaj dane przy zapisie
$clean_input = sanitize_text_field( $_POST['custom_field'] );
update_post_meta( $post_id, '_custom_field', $clean_input );
2. Escapuj dane przy wyświetlaniu
Używaj odpowiednich funkcji w zależności od kontekstu:
esc_html() – przy wyświetlaniu w treści HTML,
esc_attr() – wewnątrz atrybutów (np. value, title),
esc_url() – przy linkach,
esc_js() – w kodzie JavaScript.
Bezpieczny przykład:
echo '<p>' . esc_html( $_GET['message'] ) . '</p>';
Zasady bezpiecznego kodowania w WordPressie
- Zawsze sanityzuj dane wejściowe.
Używaj funkcji sanitize_* przy zapisie (np. sanitize_text_field(), sanitize_email(), sanitize_url()).
- Zawsze escapuj dane przy wyświetlaniu.
Nigdy nie wyświetlaj danych użytkownika bez esc_*.
- Używaj nonce i sprawdzania uprawnień.
Każda akcja w panelu (formularz, zapis opcji, AJAX) powinna mieć wp_nonce_field() oraz current_user_can().
- Nie ufaj danym z zewnątrz.
Nawet jeśli pochodzą z Twojego własnego formularza.
- Regularnie aktualizuj motywy i wtyczki.
Większość włamań wynika z luk w starych wersjach kodu.
Przykład bezpiecznego formularza w WordPressie
<form method="post">
<?php wp_nonce_field( 'save_form', 'my_form_nonce' ); ?>
<input type="text" name="user_name" value="<?php echo esc_attr( get_option( 'user_name' ) ); ?>">
<input type="submit" value="Zapisz">
</form>
<?php
if ( isset( $_POST['my_form_nonce'] ) && wp_verify_nonce( $_POST['my_form_nonce'], 'save_form' ) ) {
$name = sanitize_text_field( $_POST['user_name'] );
update_option( 'user_name', $name );
echo '<p>Dane zapisane poprawnie.</p>';
}
?>
Ten kod:
- chroni przed CSRF (Cross-Site Request Forgery) dzięki nonce,
- sanityzuje dane przy zapisie,
- escapuje dane przy wyświetlaniu,
- nie używa żadnych zewnętrznych wtyczek.
Dodatkowe środki ochrony
- Wyłącz edycję plików w panelu:
define( 'DISALLOW_FILE_EDIT', true );
- Zablokuj wykonywanie PHP w katalogach uploadów:
.htaccess: <Files *.php> deny from all </Files>
- Ogranicz dostęp do pliku wp-config.php:
<Files wp-config.php> order allow,deny deny from all </Files>
Podsumowanie
Zabezpieczenie WordPressa przed SQL Injection i XSS nie wymaga żadnych wtyczek — wystarczy przestrzegać dobrych praktyk kodowania.
Używaj funkcji sanitize_* i esc_*, zawsze korzystaj z $wpdb->prepare() i wp_nonce_field().
To najprostszy i najskuteczniejszy sposób, by Twój kod był odporny na najczęstsze ataki.