@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

WordPressin turvallinen käyttäjäsyötteen käsittely kehittäjilleKäyttäjäsyötteen käsittely on WordPress-kehityksessä yksi tärkeimmistä turvallisuuden osa-alueista. Lähes kaikki yleiset haavoittuvuudet kuten XSS, SQL-injektio ja CSRF syntyvät siitä, että syötettä ei käsitellä oikein ennen sen tallentamista tai tulostamista. WordPress tarjoaa tähän valmiit työkalut, mutta niiden oikea käyttö on täysin kehittäjän vastuulla.

Tiivistelmä
Kaikki syöte on epäluotettavaa

Perusperiaate on yksinkertainen: mitään käyttäjän syöttämää dataa ei voi koskaan pitää turvallisena sellaisenaan. Tämä koskee lomakkeita, URL-parametreja, AJAX-pyyntöjä, REST API -dataa ja jopa admin-käyttäjien syötteitä....

Sanitointi ennen tallennusta

Sanitointi tarkoittaa syötteen puhdistamista ennen kuin se tallennetaan tietokantaan tai käsitellään sovelluslogiikassa....

Validointi ennen käsittelyä

Validointi varmistaa, että syöte on oikeassa muodossa ennen kuin sitä käytetään....

Escapetus ennen tulostusta

Escapetus tehdään aina silloin, kun data näytetään käyttäjälle. Tämä on yksi tärkeimmistä turvallisuusperiaatteista WordPressissä....

SQL-injektion estäminen

WordPressin tietokantakyselyissä ei koskaan käytetä suoraa käyttäjäsyötettä....

Nonce CSRF-suojausta varten

Nonce estää CSRF-hyökkäyksiä WordPressissä....

AJAX-pyyntöjen suojaus

AJAX on yleinen hyökkäyskohde, joten sen suojaus on tärkeää....

REST API -syötteen käsittely

REST API:ssa data käsitellään request-objektin kautta....

Output turvallisuus HTML:ssä

Yksi yleisimmistä virheistä on suora tulostus ilman escapetusta....

Tiedostojen upload-turvallisuus

Tiedostojen käsittely on erityisen riskialtista....

Yleisimmät virheet kehityksessä

Tyypillisiä ongelmia WordPress-kehityksessä:...

Turvallinen malli käytännössä

Hyvä nyrkkisääntö WordPress-kehityksessä on tämä:...

Yhteenveto

WordPressin turvallinen käyttäjäsyötteen käsittely perustuu selkeisiin periaatteisiin ja valmiisiin funktioihin. Kun validointi, sanitointi ja escapetus tehdään johdonmukaisesti, suurin osa tietoturvaongelmista poistuu automaattisesti. Tärkeintä on ymmärtää,...

Kaikki syöte on epäluotettavaa

Perusperiaate on yksinkertainen: mitään käyttäjän syöttämää dataa ei voi koskaan pitää turvallisena sellaisenaan. Tämä koskee lomakkeita, URL-parametreja, AJAX-pyyntöjä, REST API -dataa ja jopa admin-käyttäjien syötteitä.

Turvallinen käsittely etenee aina samassa järjestyksessä: ensin validointi, sitten sanitointi ja lopuksi escapetus ulostulossa.

Sanitointi ennen tallennusta

Sanitointi tarkoittaa syötteen puhdistamista ennen kuin se tallennetaan tietokantaan tai käsitellään sovelluslogiikassa.

WordPress tarjoaa tähän useita valmiita funktioita.

Tekstisyötteelle käytetään sanitize_text_field-funktiota:

$clean = sanitize_text_field($_POST['name']);

Sähköpostille käytetään sanitize_email-funktiota:

$email = sanitize_email($_POST['email']);

URL-osoitteille käytetään esc_url_raw-funktiota:

$url = esc_url_raw($_POST['website']);

HTML-sisällölle turvallinen vaihtoehto on wp_kses_post, joka sallii vain turvalliset HTML-tagit:

$content = wp_kses_post($_POST['content']);

Validointi ennen käsittelyä

Validointi varmistaa, että syöte on oikeassa muodossa ennen kuin sitä käytetään.

Esimerkiksi numeron tarkistus:

if ( ! is_numeric($_POST['age']) ) {
    return;
}

Sallittujen arvojen tarkistus:

$allowed = ['small', 'medium', 'large'];

if ( ! in_array($_POST['size'], $allowed, true) ) {
    return;
}

Sähköpostin validointi:

if ( ! is_email($_POST['email']) ) {
    return;
}

Validointi estää virheellistä ja haitallista dataa pääsemästä pidemmälle järjestelmässä.

Escapetus ennen tulostusta

Escapetus tehdään aina silloin, kun data näytetään käyttäjälle. Tämä on yksi tärkeimmistä turvallisuusperiaatteista WordPressissä.

HTML-tekstille:

echo esc_html($value);

URL-osoitteille:

echo esc_url($link);

HTML-attribuuteille:

echo esc_attr($value);

JavaScript-kontekstiin:

echo esc_js($value);

Yleinen virhe on se, että escapetus unohtuu kokonaan, jolloin XSS-haavoittuvuudet ovat mahdollisia.

SQL-injektion estäminen

WordPressin tietokantakyselyissä ei koskaan käytetä suoraa käyttäjäsyötettä.

Vaarallinen tapa:

$wpdb->query("SELECT * FROM users WHERE id = $_GET[id]");

Turvallinen tapa käyttää prepare-funktiota:

$wpdb->get_results(
    $wpdb->prepare(
        "SELECT * FROM users WHERE id = %d",
        $_GET['id']
    )
);

Placeholderit varmistavat, että syöte käsitellään aina oikein.

Nonce CSRF-suojausta varten

Nonce estää CSRF-hyökkäyksiä WordPressissä.

Lomakkeessa nonce lisätään näin:

wp_nonce_field('my_action', 'my_nonce');

Ja tarkistus tehdään näin:

if ( ! wp_verify_nonce($_POST['my_nonce'], 'my_action') ) {
    die('Invalid request');
}

Nonce ei ole salaus, vaan aikarajoitettu varmistus siitä, että pyyntö tulee oikeasta lähteestä.

AJAX-pyyntöjen suojaus

AJAX on yleinen hyökkäyskohde, joten sen suojaus on tärkeää.

add_action('wp_ajax_my_action', 'my_handler');

function my_handler() {

    check_ajax_referer('my_nonce', 'nonce');

    $value = sanitize_text_field($_POST['value']);

    wp_send_json_success($value);
}

Ilman nonce-tarkistusta AJAX-päätepiste on helposti hyväksikäytettävissä.

REST API -syötteen käsittely

REST API:ssa data käsitellään request-objektin kautta.

register_rest_route('myplugin/v1', '/data', [
    'methods' => 'POST',
    'callback' => function($request) {

        $param = sanitize_text_field($request['param']);

        return rest_ensure_response($param);
    }
]);

REST API vaatii aina erillisen validoinnin, koska se on avoin rajapinta.

Output turvallisuus HTML:ssä

Yksi yleisimmistä virheistä on suora tulostus ilman escapetusta.

Väärin:

echo $title;

Oikein:

echo esc_html($title);

HTML-rakenteessa jokainen muuttuja pitää escapettaa kontekstin mukaan.

Tiedostojen upload-turvallisuus

Tiedostojen käsittely on erityisen riskialtista.

Tarkistettavat asiat:

  • MIME-tyyppi
  • tiedostopääte
  • koko
  • nimi

Esimerkki:

$allowed = ['image/jpeg', 'image/png'];

if ( ! in_array($_FILES['file']['type'], $allowed, true) ) {
    return;
}

Yleisimmät virheet kehityksessä

Tyypillisiä ongelmia WordPress-kehityksessä:

  • escapetus puuttuu outputissa
  • sanitointi unohtuu inputissa
  • nonce-tarkistusta ei käytetä AJAXissa
  • SQL-kyselyt ilman preparea
  • dataa luotetaan admin-kontekstissa
  • JSON-data tulostetaan suoraan

Turvallinen malli käytännössä

Hyvä nyrkkisääntö WordPress-kehityksessä on tämä:

ensin tarkistetaan nonce
sitten validoidaan syöte
sen jälkeen sanitoidaan data
lopuksi käsitellään logiikka
ja aina escapetaan output

Yhteenveto

WordPressin turvallinen käyttäjäsyötteen käsittely perustuu selkeisiin periaatteisiin ja valmiisiin funktioihin. Kun validointi, sanitointi ja escapetus tehdään johdonmukaisesti, suurin osa tietoturvaongelmista poistuu automaattisesti. Tärkeintä on ymmärtää, että kaikki käyttäjän syöte on epäluotettavaa ja sitä pitää käsitellä eri tavalla jokaisessa vaiheessa.