PHP-lomakkeen vahvistus

Tämä luku ja seuraava luku selittävät, miten PHP:ää käytetään lomaketodataksen varmistamiseen.

PHP-lomakkeen vahvistus

Vinkki:Käsitellessäsi PHP-lomakkeita kiinnitä huomiota turvallisuuteen!

Näillä sivuilla esitellään, miten PHP-lomakkeita käsitellään turvallisesti. HTML-lomakkeiden tietojen asianmukainen vahvistaminen on tärkeää haittaohjelmien ja roskapostin ehkäisemiseksi!

Käytämme hieman myöhemmin HTML-lomakkeessa monenlaista syöttökenttää: pakollisia ja valinnaisia tekstikenttiä, valintapainikkeita sekä lähetyspainiketta:

Yllä oleva lomake käyttää seuraavia vahvistussääntöjä:

Kenttä Vahvistussäännöt
Nimi Välttämätön. Se täytyy sisältää kirjaimia ja välilyöntejä.
Sähköposti Välttämätön. Se täytyy sisältää kelvollinen sähköpostiosoite (sisältäen @ ja .).
Verkkosivusto Valinnainen. Jos täytetään, se täytyy sisältää kelvollinen URL-osoite.
Kommentti Valinnainen. Monirivinen syöttökenttä (tekstikenttä).
Gender Välttämätön. Valitse yksi vaihtoehdoista.

Tarkastellaan ensin tämän lomakkeen pelkkää HTML-koodia:

Tekstikentät

name, email ja website ovat tekstikenttiä, comment-kenttä on tekstikenttä. HTML-koodi on seuraavanlainen:

Nimi: <input type="text" name="name">
Sähköposti: <input type="text" name="email">
Verkkosivusto: <input type="text" name="website">
Kommentti: <textarea name="comment" rows="5" cols="40"></textarea>

Valintapainikkeet

gender-kenttä on valintapainike, HTML-koodi on seuraavanlainen:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Lomakkeen elementit

Lomakkeen HTML-koodi on seuraavanlainen:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>

Lähetetään lomakkeen tiedot, kun lomake on lähetetty, käyttäen method="post".

Mikä on $_SERVER["PHP_SELF"]-muuttuja?

$_SERVER["PHP_SELF"] on yksi ylialuemuuttujista, joka palauttaa nykyisen suoritettavan skriptin tiedoston nimen.

Siksi $_SERVER["PHP_SELF"] lähettää lomakkeen tiedot sivulle itselleen, ei siirry toiselle sivulle. Tällä tavalla käyttäjä voi saada virheilmoituksia lomakkeen sivulla.

Mitä on htmlspecialchars()-funktio?

htmlspecialchars()-funktio muuntaa erikoismerkit HTML-entiteeteiksi. Tämä tarkoittaa, että HTML-merkit kuten < ja > korvataan < ja > . Näin estetään hyökkääjät hyödyntämästä HTML- tai JavaScript-koodia (cross-site scripting-isku) lomakkeessa.

Tärkeä PHP-lomakkeen turvallisuuden vinkki

$_SERVER["PHP_SELF"]-muuttuja voidaan käyttää hyökkääjän hyväksi!

Jos sivusi käyttää PHP_SELF, käyttäjä voi syöttää alaviivan ja suorittaa cross-site scripting (XSS).

Vinkki:Cross-site scripting (XSS) on tietokoneohjelmistovuotojen tyyppi, joka on yleistä verkkosovelluksissa. XSS mahdollistaa hyökkääjän syöttää asiakaskoodia muiden käyttäjien selaimessa oleville sivuille.

Oletetaan, että meillä on sivu nimeltä "test_form.php", jossa on seuraava lomake:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Nyt, jos käyttäjä siirtyy osoiteriville normaalissa URL-osoitteessa: "http://www.example.com/test_form.php" yllä oleva koodi muuttuu seuraavaksi:

<form method="post" action="test_form.php">

Tähän asti kaikki on kunnossa.

Mutta jos käyttäjä syöttää seuraavan URL-osoitteen osoiteriville:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Tässä tapauksessa yllä oleva koodi muuttuu seuraavaksi:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Tämä koodi lisää skriptin ja ilmoituskomento. Ja kun tämä sivu ladataan, JavaScript-koodi suoritetaan (käyttäjä näkee ilmoituskentän). Tämä on vain yksinkertainen ja vaaraton esimerkki siitä, miten PHP_SELF-muuttujaa käytetään.

Sinun tulisi olla tietoinen Sivun <script>-tagiin voidaan lisätä mikä tahansa JavaScript-koodi!Hacker voi ohjata käyttäjän toiseen palvelimen sijaitsevaan tiedostoon, jossa on haitallista koodia, joka voi muuttaa globaaleja muuttujia tai lähettää lomakkeen toiseen osoitteeseen tallentaakseen käyttäjän tiedot jne.

Miten välttää $_SERVER["PHP_SELF"]-muuttujan hyödyntämisen?

htmlspecialchars()-funktio auttaa välttämään $_SERVER["PHP_SELF"]-muuttujan hyödyntämisen.

Lomakkeen koodi näyttää tältä:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

htmlspecialchars()-funktio muuntaa erikoismerkit HTML-entiteeteiksi. Jos käyttäjä yrittää hyödyntää PHP_SELF-muuttujaa, se johtaa seuraavaan tulosteeseen:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Ei hyödyllistä, ei vaarallista!

PHP:n lomakkeen tietojen tarkistaminen

Ensimmäinen asia, jonka teemme, on lähettää kaikki muuttujat PHP:n htmlspecialchars()-funktiolla.

Kun käyttäjä yrittää lähettää seuraavan sisällön tekstikenttään:

<script>location.href('http://www.hacked.com')</script>

- Koodi ei suoriteta, koska se tallennetaan escape-koodina, kuten näin:

<script>location.href('http://www.hacked.com')</script>

Tämä koodi on nyt turvallinen näytettäväksi sivulla tai sähköpostissa.

Kun käyttäjä lähettää lomakkeen, meidän täytyy tehdä kaksi asiaa:

  1. (PHP:n trim()-funktiolla) poistetaan käyttäjän syötteen tarpeettomat merkit (ylimääräiset välilyönnit, tabulaattorit, rivinvaihdot)
  2. (PHP:n stripslashes()-funktiolla) poistetaan käyttäjän syötteen merkkijonot (\)

Seuraavaksi luomme tarkistusfunktion (tämä on tehokkaampaa kuin kirjoittaa koodia toistuvasti).

Nimeämme funktion test_input().

Nyt voimme tarkistaa jokaisen $_POST-muuttujan test_input()-funktioilla. Skripti näyttää tältä:

Esimerkki

<?php
// Definoida muuttujat ja aseta ne tyhjiksi
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Suoritettu esimerkki

Huomaa, että skriptin alussa tarkistimme, onko lomake lähetetty käyttäen $_SERVER["REQUEST_METHOD"]. Jos REQUEST_METHOD on POST, lomake on lähetetty - ja sitä tulisi tarkistaa. Jos sitä ei ole lähetetty, ohita tarkistus ja näytä tyhjä lomake.

Kuitenkin, yllä olevassa esimerkissä kaikki syöttökentät ovat valinnaisia. Vaikka käyttäjä ei syöttäisikään mitään tietoja, skripti toimii silti normaalisti.

Seuraava vaihe on luoda pakolliset syöttökentät ja luoda tarvittaessa virheilmoituksia.