Suojattu WordPress-lomakkeen lähetys
Vuosia sitten kirjoitin viestin, jossa jaoin julkisen toiminnon selvittääkseni, oliko käyttäjällä lupa tallentaa tietoja WordPress-tietokantaan. Voit nähdä alkuperäisen olemuksen kaikessa ikääntyneessä loistossaan (yhdessä kiinteiden kommenttien kanssa) täällä (se on jopa viisi vuotta vanha – vau).
Kuten kaikissa ohjelmointiin liittyvissä asioissa, aika kuluu, asiat jalostuvat ja asiat [toivottavasti] paranevat kuin ennen.
Vaikka käytän edelleen ja suosittelen user_can_save (tai userCanSave) -funktion muunnelmaa, mielestäni on myös tärkeää käydä läpi pyynnön vahvistusprosessin erottaminen.
Nyt ei siis ole kyse vain sen määrittämisestä, onko käyttäjällä käyttöoikeuksia, vaan asiakkaalta tulevien tietoturvatietojen tarkistaminen – olipa kyse sitten lähettämisestä takaisin palvelimelle tai Ajaxin kautta tehtyyn pyyntöön – ja tehdä se käyttämällä hyviä ohjelmointitekniikoita, jotka yhdenmukaistavat sekä WordPressillä että PHP:llä.
Selvyyden vuoksi tämä koskee enemmän suojattua WordPress-lomakkeen lähettämistä asetussivulta tai asetussivulta kuin se on esimerkiksi mallista tuleva lomake. Se on toinen postaus toista kertaa.
Silti monet meistä työskentelevät WordPressin sovellusten rakentamisen parissa ja jotka edellyttävät seuraavaa.
Suojattu WordPress-lomakkeen lähetys
Tässä viestissä en aio käsitellä yksityiskohtia sen määrittämiseksi, onko jokin automaattinen tallennus vai jälkiversio .
Aion kuitenkin käydä läpi prosessin, jossa otan funktion, joka on vastuussa saapuvien tietojen validoinnista, ja teen sen käyttämällä modernia lähestymistapaa käyttäen oliopohjaisia käytäntöjä ja sekä WordPressin API- että PHP-toimintoja.
1 Yleiseltä tasolta alkaen
Oletetaan perustasolta, että on olemassa perusluokka, josta on muita alaluokkia, jotka hyödyntävät tätä toimintoa. Tämä kertoo meille, että meidän on käytettävä suojattua näkyvyyden muokkaajaa.
Tiedämme myös, että käsittelemme WordPressin nonce-arvoa ja siihen liittyvää toimintaa. Tämä tarkoittaa, että funktion allekirjoitus näyttää suunnilleen tältä :
<?php
protected function verifyRequest($nonce, $action);
2 Puhdista tiedot, varmista, ettei ole mitään
Kaikkien palvelimelle lähetettyjen tietojen osalta tiedämme, että meidän on tarkistettava, että tiedot on asetettu, ja jos on, meidän on desinfioitava tiedot.
Tämä tarkoittaa, että tarvitsemme seuraavat toiminnot:
Tiedämme myös, että meidän on tarkistettava nonce, joten tarvitsemme myös wp_verify_nonce.
3 Toimiva ensimmäinen passi
Tämän toiminnon toimiva ensimmäinen läpimeno voi näyttää tältä:
<?php
protected function verifyRequest($nonce, $action)
{
return isset($_GET[$nonce]) &&
wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action);
}
Mutta entä jos joku jakaa tietoja, joille on lähetetty POST – pyyntö (verrattuna GET – pyyntöön)? Sitten voimme muokata funktiota näyttämään tältä:
<?php
protected function verifyRequest($nonce, $action)
{
return (isset($_GET[$nonce]) &&
wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action)) || (isset($_POST[$nonce]) &&
wp_verify_nonce(strip_tags(stripslashes($_POST[$nonce])), $action)
);
}
Ja tämä riittäisi. Mutta jos todella haluamme tietyn funktion olevan mahdollisimman puhdas, voimme hajottaa tämän vielä pidemmälle.
4 Toiminto jokaiseen tarkoitukseen
Yllä olevan koodin perusteella tiedämme, että meidän on käsiteltävä sekä GET-pyynnöt että POST-pyynnöt. PHP tarjoaa filter_input -funktion, joka on hyödyllinen, helpompi lukea (no, tämä on subjektiivista), mutta myös läpäisee useita koodin laatutarkastuksia.
Lisäksi voimme käyttää yksinkertaista tehdastyyppistä funktiota erottamaan logiikka erillisiksi funktioiksi, kuten tämä:
Ensin meidän on kirjoitettava kaksi erillistä funktiota – yksi POST-pyyntöä varten:
<?php
private function verifyPostRequest($nonce, $action)
{
return
isset($_POST[$nonce]) &&
wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_POST, $nonce))), $action);
}
Ja yksi GET-pyyntöä varten:
<?php
private function verifyGetRequest($nonce, $action)
{
return
isset($_GET[$nonce]) &&
wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_GET, $nonce))), $action);
}
Sitten voimme sitoa sen yhteen alkuperäiseen funktioon seuraavasti:
<?php
protected function verifyRequest($nonce, $action)
{
switch (strtolower($_SERVER['REQUEST_METHOD'])) {
case 'post':
return $this->verifyPostRequest($nonce, $action);
break;
case 'get':
return $this->verifyGetRequest($nonce, $action);
break;
default:
return false;
break;
}
}
Saapuvien pyyntöjen puhdas hallinta
Ehkä tämä näyttää monimutkaiselta tavalta käsitellä yksinkertaista ratkaisua, kun otetaan huomioon alkuperäinen jaettu koodisarja.
Se on varmasti mahdollista varsinkin, jos olet ajan rajoitusten alla tai et välitä niin paljon asioiden hajottamisesta pienimpiin mahdollisiin atomikomponentteihin (tai jopa testattaviin).
Mutta jos haluat kirjoittaa oliopohjaista koodia mahdollisimman tarkasti, ehkä tämä prosessi auttaa juuri siinä.
