Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: PHP-projekti: Kuvagalleria

Zeeli [02.01.2010 12:48:01]

#

Tämä on osa PHP-projektia.

Sain vihdoin koodailtua kuvagallerian(luokan).

Luokkaa käytetään jotakuinkin näin:

try {
	$asetukset = array(
		'polku' => 'kuvat/', //Polku kuviin
		'koko' => 128, //Pikkukuvan koko pikseleissä
		'laatu' => 75, //Pikkukuvan laatu, 0-100, 100 paras
		'vierekkain' => 6, //Kuinka monta kuvaa näytetään vierekkäin ennen rivinvaihtoa
		'sallitut' => array('png', 'jpg', 'jpeg') //Sallitut kuvatiedostot
	);

	$galleria = new Galleria($asetukset);

	switch($_GET['kuva']) {
		case 'kaikki':
			$galleria->naytaKaikki();
			break;
		default:
			$galleria->naytaKuva($_GET['kuva']);
	}
} catch(Exception $e) {
	echo $e->getMessage();
}

Testisivu löytyy täältä

Lähdekoodit löytyy täältä

Kommentteja, korjauksia, ehdotuksia?

trilog [02.01.2010 16:21:26]

#

Skriptissä on paha XSS-aukko. Tosin palvelimella, jolla testisivu on, on nähtävästi Apachen mod_secure-lisäosa käytössä, jolloin se torjuu suurimman osan hyökkäyksistä. Ilman tätä lisäosaa, hyökkääjä voisi sisällyttää mitä tahansa html- tai javascript-koodia sivulle. Lisäksi, mihin tahansa palvelimella olevaan tiedostoon päästään käsiksi, esimerkiksi tämä ei ole suotavaa.

Oliopohjainen toteutus on toki hieman selvempi, mutta siitä ei ole erityisemmin tässä hyödytty, joten skriptistä on tehty toimintakelvoton PHP:n versiolla 4.

Kommentointi mieluiten yhdellä kielellä.

Kuvien katselusivulle olisi kaivannut seuraava ja edellinen nappeja.

Zeeli [02.01.2010 16:37:08]

#

Kiitoksia palautteesta.

Tuo aukko pitää tosiaan tukkia.

Suunnittelin katselusivulle ns. kuvaliuskan josta löytyisi nuo napit.

Valmishan tuo ei ole missään nimessä, joten kommentit yms. tulee muuttumaan.


EDIT: Mikäköhän olisi ideaaliratkaisu, jolla voisi rajoittaa katselun vain määritettyyn kansioon? Onko esim ratkaisu jossa tarkistetaan löytyykö muuttujasta '..' ja '/' merkkejä ja heitetään sen perusteella virhe, liian purkka?

trilog [02.01.2010 17:16:54]

#

Zeeli kirjoitti:

EDIT: Mikäköhän olisi ideaaliratkaisu, jolla voisi rajoittaa katselun vain määritettyyn kansioon?

Yksi ratkaisu olisi verrata onko pyydetyn polun kansio sama kuin kuvakansio, esimerkki:

<?php
$pyydetty = "kuvat/../../../../kuva.png";

if (dirname($pyydetty) != "kuvat")
    echo "ei sallittu";

Lisäksi, tiedostonimen päätteen kaivamiseen ja tarkistamiseen käyttäisin säännöllistä lauseketta:

<?php
$sallitut = "jp[e]?g|png|gif";
$tiedosto = "kuva.png";

$m = array();
if (preg_match("#\.\b({$sallitut})\b$#i", $tiedosto, $m))
   echo "Pääte, {$m[1]}, oli sallittu.";

Näin tiedostonimissä voi olla pisteitäkin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta