WordPressin
wpdb->prepare()wpdb->prepare()- Mitä wpdb->prepare() tekee
wpdb->prepare() muuttaa SQL-lauseen ja sen parametrien yhdistelmän turvalliseksi. Esimerkki:...
- Hyödyt
Estää perus-SQL-injektiot...
- Mitä wpdb->prepare() EI suojaa
- 1. Taulujen ja sarakkeiden nimiä
wpdb->prepare() ei voi escapen taulujen tai sarakkeiden nimiä. Esimerkiksi tämä on vaarallinen:...
- 2. ORDER BY ja LIMIT -parametreja ilman tarkistusta
Myös ORDER BY- ja LIMIT-arvot voivat olla hyökkäyskohteita:...
- 3. Rinnakkaiset SQL-injektioyrittäjät (kaksoiskomennot)
Jos lauseessa on useita käyttäjän inputteja, mutta prepare on käytetty väärin, hyökkäys on mahdollinen. Esimerkiksi, jos yhdistetään valmis SQL + prepare väärin:...
- 4. Muut hyökkäykset kuin SQL-injektio
wpdb->prepare() suojaa vain SQL-injektiolta. Se ei estä:...
- 5. Serialisoitu data ja JSON
Jos syötät serialisoitua dataa tai JSON:ia SQL-lauseeseen, prepare ei tarkista, että rakenne pysyy eheänä. Väärin käsiteltynä tämä voi rikkoa sovelluksen logiikan....
- 6. Useiden parametrien väärä järjestys
Prepare ei estä virheellisiä formaattimerkkejä tai parametrien järjestyksen rikkomista. Esimerkiksi:...
- Parhaat käytännöt
Käytä preparea aina parametrien kanssa, ei taulujen tai sarakkeiden nimien osalta....
- Yhteenveto
wpdb->prepare() on tehokas työkalu SQL-injektioiden ehkäisyyn, mutta se EI suojaa SQL:n rakennetta, taulujen nimiä, ORDER BY- ja LIMIT-arvoja, muita hyökkäyksiä kuin SQL-injektioita, eikä väärin järjestettyjä parametreja. Luottamalla pelkkään prepareen voi saada harhan turvallisuudesta....
- Aiheeseen sopivia artikkeleita
wpdb->prepare()Mitä wpdb->prepare() tekee
wpdb->prepare()global $wpdb;
$user_input = $_GET['id'];
$query = $wpdb->prepare( "SELECT * FROM wp_posts WHERE ID = %d", $user_input );
$results = $wpdb->get_results( $query );
Tässä
%dwpdb->prepareHyödyt
-
Estää perus-SQL-injektiot
-
Escapaa merkit oikein SQL-lauseessa
-
Tekee koodista ennustettavan ja turvallisemman
Mitä wpdb->prepare() EI suojaa
1. Taulujen ja sarakkeiden nimiä
wpdb->prepare()$table = $_GET['table']; // käyttäjä voi syöttää "wp_users; DROP TABLE wp_posts;"
$query = $wpdb->prepare( "SELECT * FROM $table WHERE ID = %d", $id );
$wpdb->get_results( $query );
$table%d%s2. ORDER BY ja LIMIT -parametreja ilman tarkistusta
Myös ORDER BY- ja LIMIT-arvot voivat olla hyökkäyskohteita:
$order = $_GET['order']; // esim. "DESC; DROP TABLE wp_users"
$query = $wpdb->prepare( "SELECT * FROM wp_posts ORDER BY post_date $order" );
Prepare ei escapaa SQL-avainsanoja, joten käyttäjä voi lisätä haitallisen koodin.
3. Rinnakkaiset SQL-injektioyrittäjät (kaksoiskomennot)
Jos lauseessa on useita käyttäjän inputteja, mutta prepare on käytetty väärin, hyökkäys on mahdollinen. Esimerkiksi, jos yhdistetään valmis SQL + prepare väärin:
$unsafe_sql = "WHERE post_status = 'publish'";
$query = $wpdb->prepare( "SELECT * FROM wp_posts $unsafe_sql AND ID = %d", $id );
Tässä
unsafe_sql4. Muut hyökkäykset kuin SQL-injektio
wpdb->prepare()-
XSS-hyökkäyksiä (javascript injection)
-
CSRF-hyökkäyksiä (lomakepyynnöt)
-
Arbitrary file inclusion -ongelmia
-
Sovelluslogiikan väärinkäyttöä
Nämä vaativat omat turvamekanisminsa (esim.
esc_html()wp_nonce_*5. Serialisoitu data ja JSON
Jos syötät serialisoitua dataa tai JSON:ia SQL-lauseeseen, prepare ei tarkista, että rakenne pysyy eheänä. Väärin käsiteltynä tämä voi rikkoa sovelluksen logiikan.
6. Useiden parametrien väärä järjestys
Prepare ei estä virheellisiä formaattimerkkejä tai parametrien järjestyksen rikkomista. Esimerkiksi:
$query = $wpdb->prepare( "SELECT * FROM wp_posts WHERE ID = %d AND post_title = %s", $title, $id );
Tässä
%d%sParhaat käytännöt
-
Käytä preparea aina parametrien kanssa, ei taulujen tai sarakkeiden nimien osalta.
-
Tarkista kaikki käyttäjän syötteet etukäteen: whitelistaa ORDER BY, LIMIT ja taulujen nimet.
-
Käytä aina
,esc_html()jaesc_attr()muiden hyökkäysten ehkäisyyn.wp_nonce_* -
Älä koskaan liitä käyttäjän syötettä suoraan SQL:ään ilman tarkistusta, edes preparea käytettäessä.
-
Testaa eri hyökkäysskenaarioita kehitysympäristössä.
Yhteenveto
wpdb->prepare()Oikea turvakäytäntö yhdistää prepare-funktion, käyttäjän syötteen validoinnin ja WordPressin muita turvallisuus-APIja. Silloin koodi pysyy turvallisena, skaalautuvana ja ennustettavana.
