Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Osoitekentän tarkastaminen

Sivun loppuun

sspec [25.09.2011 16:30:19]

#

Päivää, Teen tällä hetkellä ensimmäisiä php-ohjelmointi sivuja(kouluun) ja törmäsin ongelmaan.
Miten voin tarkastaa että osoitekentällä on se tieto mitä lähetin edelliseltä sivulta? Esim:
http://localhost:8080/jone/skole/talleta.php?ktunnus=jouni&pnumero=050-133113
Tiedot siirretään get metodilla talleta.php sivulle, mutta tietoja voi muokata välistä.
Sain korjattua sivut silleen että ("ktunnus")&&("pnumero") (jouni 050-133113)sisällön muuttaa niin se herjaa siitä, mutta en tiedä miten lähestyisin asiaa jos ktunnus/pnumero kentätä muuttaa. niin siirtäisi vaikka takaisin edelliselle sivulle tai avaisi suoraan tyhjän sivun johon laitan tekstiä yms.

Itsehän olisin laittanut tiedot eteenpäin esim. Sessiolla, mutta tehtävä vaatii get funktion käyttöä.

Antti Laaksonen [25.09.2011 16:39:00]

#

Palvelimen kannalta edellisen sivun GET-lomakkeen käyttäminen ja tietojen kirjoittaminen suoraan osoitteeseen näyttää samalta, joten et voi varmistua siitä, että tiedot on kirjoitettu lomakkeessa.

Onko tuosta todellista ongelmaa, että käyttäjä voi antaa tiedot myös suoraan osoitteen osana? Toisaalta yleensä GET-lomaketta ei käytetä, jos tiedot on tarkoitus tallentaa jonnekin.

sspec [25.09.2011 17:02:44]

#

On sillä tavallaan sivun toimivuuden kannalta. Löysin hyvän esimerkin:
https://www.ohjelmointiputka.net/keskustelu/25492-osoitekentän-tarkastaminen
Kun tosta poistaa vaikka muutaman merkin "sivu" esim "sv", niin se kuitenkin osaa siirtää takas sivu=1 osoitteeseen.

Minun tapauksessa tulee php virheitä ja se sivu ei toimi sen jälkeen.
Tuota apua pystyisi sen jälkeen käyttämään sivustoissa jotka hakevat tietoa esim. tietokannasta yms. niin ne sivut ei kaadu siihen.

punppis [26.09.2011 04:33:45]

#

Putkassa tuo on toteutettu varmaankin niinkin yksinkertaisesti kuin

if(!isset($_GET["sivu"]))
    header("Location: ./?sivu=1");

Jos lomakkeessa on useampi vaihe, niin pelkän GETin käytöllä on mahdotonta tietää, muokattiinko dataa välissä. Tieto on väkisinkin laitettava sessioihin, jolloin käyttäjä ei voi sitä muokata.

Mitä tarkoitat tuolla tietojen välissä muokkaamisella? Kun täytät GET-lomakkeen ja painat lähetä, niin selain ei tee muuta kuin uudelleen ohjaa selaimen osoitteeseen, joka sisältää myös parametrit. Kuten Antti jo sanoi, niin käyttäjä voisi yhtä lailla täyttää lomakkeen osoiteriville, eikä PHP voi mitenkään tietää onko data tullut sen lomakkeen kautta vai manuaalisesti osoiteriville.

Toki yksi vaihtoehto on lähettää jokaisen lomakkeen yhteydessä tarkiste kaikista tähän asti annetuista tiedoista. Jos tarkiste ei täsmää, niin tehdään asianmukaiset toimenpiteet. Mutta tätä tarkistettakin voi käyttäjä toki muokata vapaasti, mutta se on vähän vaikeampaa (mahdotonta ilman pääsyä palvelimelle) jos tarkiste suolataan.

Fiksuinta on toki myös laittaa valmiiksi lähetetyt datat sellaisena lomakkeeseen, ettei niitä edes voi muokata.

Edit: eipä ollut fiksumpaa tekemistä niin tässä jonkinlainen versio tuosta tarkisteesta mitä tarkoitin. kommentoimatonta koodia, mutta kai tuosta jotain oppii. tuossa voi siis täyttää kaksi kenttää kerrallaan ja herjaa jos tekee muutoksia.

<?php
	$vaihe = 0;
	if($_GET) {
		$vaihe = $_GET["vaihe"];

		$vaiheet = array(
			array("eka", "toka"),
			array("kolmas", "neljas"),
			array("viides", "kuudes")
		);

		$vanhaTarkiste = "";
		$tarkiste = "";
		foreach($vaiheet as $key => $value) {
			if($key >= $vaihe && empty($vanhaTarkiste)) {
				$vanhaTarkiste = md5("suola".$tarkiste);
			}
			foreach($value as $data) {
				$tarkiste .= $_GET[$data];
			}
		}
		$tarkiste = md5("suola".$tarkiste);

		if($vaihe > 0) {
			if($vanhaTarkiste != $_GET["tarkiste"]) {
				echo "Tarkiste ei täsmää";
			}
		}
		$vaihe++;
	}
?>
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="get">
	eka: <input type="text" name="eka" value="<?php echo @$_GET["eka"]; ?>" />
	toka: <input type="text" name="toka" value="<?php echo @$_GET["toka"]; ?>" />
	kolmas: <input type="text" name="kolmas" value="<?php echo @$_GET["kolmas"]; ?>" />
	neljas: <input type="text" name="neljas" value="<?php echo @$_GET["neljas"]; ?>" />
	viides: <input type="text" name="viides" value="<?php echo @$_GET["viides"]; ?>" />
	kuudes: <input type="text" name="kuudes" value="<?php echo @$_GET["kuudes"]; ?>" />
	<input type="hidden" name="vaihe" value="<?php echo $vaihe; ?>"	 />
	<?php
		if($_GET) {
			echo '<input type="hidden" name="tarkiste" value="'.$tarkiste.'" />';
		}
	?>
	<input type="submit" value="lähetä" />
</form>

Tuo koodi on silti sangen monimutkaista. Sessioilla tämän tekeminen olisi huomattavasti helpompaa, fiksumpaa ja selkeämpää.

The Alchemist [26.09.2011 07:29:26]

#

sspec kirjoitti:

Minun tapauksessa tulee php virheitä ja se sivu ei toimi sen jälkeen.
Tuota apua pystyisi sen jälkeen käyttämään sivustoissa jotka hakevat tietoa esim. tietokannasta yms. niin ne sivut ei kaadu siihen.

Sinun tehtäväsi ohjelmoijana on varautua näihin "yllättäviin" poikkeustilanteisiin. Siinä ei ole mitään hankalaa. Tarkistat syötteet aina ennen niiden käyttämistä kriittisissä toiminnoissa.

tkok [26.09.2011 08:57:20]

#

Syötteiden oikeasta paikasta tulon voit tarkistaa lisäämällä lähetettäviin tietoihin hashin.

$hash = md5($ktunnus . $pnumero . $salainensuolasana)

sitten sivulle jossa käytät noita ktunnusta ja pnumeroa

$testhash = md5($ktunnus . $pnumero . $salainensuolasana)
if($hash == testhash) jne.

Grez [26.09.2011 10:39:33]

#

Mitäs noi ktunnus ja pnumero on? Jotain Eka Vekaran juttuja?

sspec [26.09.2011 16:34:32]

#

Siis eihän ole mitään järkeä viedä tietoa get metodilla (minun mielestä), mutta tehtävän anto vaati tämän. Kiitos Punpis avustasi ja sain tehtävän tehtyä noinkin "helpolla" koodilla. Tosin sitä piti muuttaa hiukan.

Grez kirjoitti:

Mitäs noi ktunnus ja pnumero on? Jotain Eka Vekaran juttuja?

Jotain get metodilla tuotuja rojuja.

Sspec kiittää ja kuittaa

Metabolix [26.09.2011 16:46:44]

#

sspec kirjoitti:

Grez kirjoitti:

Mitäs noi ktunnus ja pnumero on? Jotain Eka Vekaran juttuja?

Jotain get metodilla tuotuja rojuja.

Tarkoitus oli varmaan huomauttaa, että tuollaiset epämääräiset nimien lyhentelyt tekevät koodista sekavaa eivätkä oikeasti edes nopeuta koodaamista olennaisesti. (Huomenna ehkä jo hidastavat, kun eivät ole tuoreessa muistissa.)


Sivun alkuun

Vastaus

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

Tietoa sivustosta