Koti » Turvallisesti PHP-koodia verkkosivulle

Turvallisesti PHP-koodia verkkosivulle

PHP:tä käytetään paljon verkkosivuilla ja oikein tehtynä se on hyvä kieli. Tietoturva on tärkeä verkkosivuilla, sillä se on julkinen näkymä mitä käyttäjät käyttävät. Puutteellinen tietoturva aiheuttaa paljon harmia niin verkkosivun käyttäjälle kuin ylläpitäjälle.

PHP-Istunnot

Kun on kyseessä yksityisviestejä lähettävä sivusto, niin tulee varmistaa ettei toinen käyttäjä pääse lukemaan toisen viestejä. Joissakin on tämä toteutettu tunnistenumerolla (id) ja tätä id-numeroa vaihatamalla haavoittuvaisessa sivussa voi päästä lukemaan toisen viestin. Näin tietysti ei saa käydä vaan sivusto pitää varmistaa että istunossa oleva käyttäjällä on oikeus lukea tällä tunnistella olevia viestejä ja jos oikeutta ei ole, tulee näyttää sopiva virheilmoitussivu.

SQL-injektio

SQL-injektio on yleinen virhe koodissa, joka aiheutuu siitä että käyttäjän tietoja ei tarkisteta ennen tietokantaa kirjoittaessa.

Tässä alla on esimerkissä yleinen tapa tehdä kirjautuminen MySQL-tietokannassa. Eli MySQL:ssä ajetaan query, jossa haetaan käyttäjänimeä ja salasanaa.

SELECT id FROM users WHERE username = '$username' and password '$password'

Käyttäjä tosiaan voi tässä yksinkertaisuudessa syöttää käyttäjätunnukseksi normaalisti admin ja salasanan. Mutta, jos tarkkaan katsoo, voi käyttäjätunnus kenttään syöttää esimerkiksi käyttäjätunnus admin’ — ,  ilman salasanaa, sillä SQL lauseke kommentoidaan eli ei ajeta.

Käytönnössä siis MySQL:ssä ajetaan siis

SELECT id FROM users WHERE username = 'admin' -- and password ''

Joka on käytännössä sama kuin

SELECT id FROM users WHERE username = 'admin'

Muita tapoja on käyttää OR 1=1 ja  ””=”” jotka ovat aina TOSI. Tällä tavoin SELECT funktiossa valitan usein ensimmäinen tili tietokannasta ORDER perusteella (yleensä ID 1).

SQL-injektiolla voi myös tehdä muutakin haittaa kuten poistaa tietokannasta tauluja tai kokonaisia tietokantoja sekä lisätä sinne tietoa. Tästä syystä tulee olla todellakin tarkkana SQL-lausekkeiden kanssa.

Tästä syystä suosittelen käyttämään PDO-funktiota PHP:ssä, joka suojaa tehokkaasti SQL-injektiolta. Näin käyttäjän tiedot lähetetään tietokantaan turvallisesti eikä rakennetta voida muuttaa.

Lisätietoa löytyy esimerkiksi täältä: https://www.w3schools.com/sql/sql_injection.asp

XSS-haavoittuvuus

XSS-haavoittuvuus on myös yleinen ja se syntyy kun voit selaimella lähettää tietoa sivustolle ja sivusto tulostaa sen sellaisenaan. PHP:llä tämä on yleistä GET ja POST-funktioissa.

<?php
$name = $_POST['name'];
echo $name;
?>

Tässä PHP:ssä luetaan postauksesta tullut nimi ja tulostetaan sivustolle. Tähän voi syöttää vapaasti HTML/CSS/JS koodia muokaten nykyistä verkkosivun ulkoasua. JS:n avulla tietysti voit tehdä uudelleenohjauksen. GET-funktio on vielä vaarallisempi kuin POST-funktion kanssa. Tähän on helppo ratkaisu onneksi, lisätään  koodiin htmlspecialchars() funktio.

<?php
$name = htmlspecialchars($_POST['name'];
echo $name;
?>

Joka esittää kaikki HTML/CSS/JS:t sitten sivustolla tageinä, joten sivustoa ei voi muokata enään.

POST-funktiossa se ei yleensä niin vaarallinen ole kuin GET-funktiossa. Get-funktiossa voit testata XSS-haavoittuuvutta lisäämällä alla olevan koodin osoitepalkkiin ja POST-funktiossa lomakkeeseen. Jos saat POP-upin ja tekstisi, niin sivusto on haavoittuvainen XSS:lle.

<script> alert("Sivustolla on XSS haavoittuvuus"); </script>

Salasanat

Tavallinen tapa on tallentaa salasanat tietokantaa selväkielisestä salasanasta laskettu tiiviste. PHP:ssä on valmiina hyvä funktio tiivisteen laskemista varten password_hash ja tarkistamiseen password_verify.

Kommentoi