Jak zabezpieczyć WordPress przed SQL Injection i XSS bez wtyczek

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:

  1. Używaj zawsze $wpdb->prepare() do wszystkich zapytań SQL.
  2. Nie łącz danych wejściowych bezpośrednio z zapytaniem.
  3. 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

  1. Zawsze sanityzuj dane wejściowe.
    Używaj funkcji sanitize_* przy zapisie (np. sanitize_text_field(), sanitize_email(), sanitize_url()).
  2. Zawsze escapuj dane przy wyświetlaniu.
    Nigdy nie wyświetlaj danych użytkownika bez esc_*.
  3. Używaj nonce i sprawdzania uprawnień.
    Każda akcja w panelu (formularz, zapis opcji, AJAX) powinna mieć wp_nonce_field() oraz current_user_can().
  4. Nie ufaj danym z zewnątrz.
    Nawet jeśli pochodzą z Twojego własnego formularza.
  5. 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.

KROK 1 Z 4

Z CZYM POTRZEBUJESZ POMOCY?