Mikäköhän olisi suositeltava tapa seuraavanlaisen tekniikan toteuttamiseen:
Painat linkkiä, joka johtaa sivulle ../edit/index.php
Linkki vie mukanaan tiedon="kansio"
Eli olisiko linkki esimerkiksi muotoa <a href="../edit/index.php" value="kansio">Linkki</a>
Linkin takana oleva sivu käsittelee linkin mukana tullutta tietoa seuraavanlaisesti. Kuinka saan noiden neljän kysymysmerkin paikalle edelliseltä sivulta mukana tulleen "kansio" tiedon. Tieto vaihtuu, riippuen siitä miltä sivulta se tulee.
<?php $tiedosto = "../????/index.php"; //avataan $tiedosto $avattu = fopen ($tiedosto, "rb"); //tiedosto luetaan fread-funktiolla muuttujaan $data $data = fread ($avattu, filesize ($tiedosto)); // suljetaan avattu tiedosto fclose ($avattu); //tulostetaan data textareaan echo $data; ?>
Yritin selittää mahdollisimman selvästi, toivottavasti joku ymmärsi.
<a href="../edit/index.php?foo=kansio&bar=muutatietoa&foobar=barfoo">linkki</a>
Nuo kysymysmerkin jälkeen olevat muuttujat ovat sitten luettavissa muuttujista
$_GET["foo"], $_GET["bar"], $_GET["foobar"].
Myös lomakkeilla (form) tietoa voi lähettää eteenpäin.
Eli näinkö?
<a href="../edit/index.php?foo=kansio>Linkki</a>
<?php $tiedosto = "../$_GET["foo"]/index.php"; //avataan $tiedosto $avattu = fopen ($tiedosto, "rb"); //tiedosto luetaan fread-funktiolla muuttujaan $data $data = fread ($avattu, filesize ($tiedosto)); // suljetaan avattu tiedosto fclose ($avattu); //tulostetaan data textareaan echo $data; ?>
Hmm, jostain syystä mulla on voimakas tunne, ettei mene ihan noin.
Juu, ei missään tapauksessa noin, tuohon kun heittää fooksi jotain sopivaa niin pääsee lukemaan vaikka mitä. Ja muutenkin se olisi {$_GET["foo"]}
<a href="../edit/index.php?foo=kansio>Linkki</a>
<?php $muokkaus = $_GET['foo']; $tiedosto = "../($muokkaus)/index.php"; ?>
Näyttääkö yhtään paremmalta?
Kyyllä noin. Muista aina tarkistaa $_GET -taulukon sisältö väärinkäytön varalta, koska käyttäjä voi laittaa siihen mitä vain.
Ja muuttuja merkkijonon sisällä kaarisulkeisiin, ei normaaleihin sulkuihin.
Tosin tuossa tapauksessa ei ole kaarisulut pakollisia. Turvallisuusnäkökohtana voisi ajatella että esimerkiksi vain merkit [A-Z][a-z][0-9] olisivat sallittuja merkkejä tuossa polun nimessä ja se tarkistettaisiin ensin. (Joko poistetaan muut merkit suoraan tai sitten ilmoitetaan käyttäjälle että pyyntö on virheellinen tms)
Seuraava ongelma. Mikäli päättelin oikein, tiedosto index.php ei lähetä muuttujaa $muokkaus save.php:lle. Osaako joku neuvoa, miten saisin saman muuttujan tiedon myös save.php:lle?
Tiedosto index.php:
<h1>Muokkaa sivua</h1>
<form action="save.php" method="post">
<textarea name="muokattu" rows="20" cols="80">
?> <?php $muokkaus = $_GET['foo']; $tiedosto = "../{$muokkaus}/index.php"; //avataan $tiedosto $avattu = fopen ($tiedosto, "rb"); //tiedosto luetaan fread-funktiolla muuttujaan $data $data = fread ($avattu, filesize ($tiedosto)); // suljetaan avattu tiedosto fclose ($avattu); //tulostetaan data textareaan echo $data; ?>
</textarea><br>
<input type="submit" value="tallenna">
</form>
Tiedosto save.php
<?php $muokkaus = $_GET['foo']; $tiedosto="../{$muokkaus}/index.php"; //avataan tiedosto kirjoittamista varten $d=fopen($tiedosto,"w"); //lisätään tiedostoon muokaustilan textareasta saatu tieto jonka name="muokattu" //stripslashes -funktio poistaa kenoviivat(\) jotka php muuten tulostaa //heittomerkkien yms. syntaksiin kuuluien merkkien eteen. fputs($d,stripslashes($_POST['muokattu'])); fclose($d); //siirrytään suoraan näyttämään tallennettu sivu echo"<meta http-equiv=refresh content='0; url=../{$muokkaus}/index.php'>"; ?>
Välitä tieto piilotetussa tekstikentässä tähän tyyliin:
<h1>Muokkaa sivua</h1> <form action="save.php" method="post"> <textarea name="muokattu" rows="20" cols="80"> <?php $muokkaus = $_GET['foo']; $tiedosto = "../{$muokkaus}/index.php"; //avataan $tiedosto $avattu = fopen ($tiedosto, "rb"); //tiedosto luetaan fread-funktiolla muuttujaan $data $data = fread ($avattu, filesize ($tiedosto)); // suljetaan avattu tiedosto fclose ($avattu); //tulostetaan data textareaan echo $data; echo '</textarea><br />'; // ********* Tämä on uutta echo '<input type="hidden" name="foo" value="{$muokkaus}" />'; ?> <input type="submit" value="tallenna" /> </form>
Ja save.php:ssä se löytyy muuttujasta $_POST['foo']
Eipä onnistu. Herjaa seuraavaa:
Warning: fopen(../{$muokkaus}/index.php) [function.fopen]: failed to open stream: No such file or directory in ../edit/save.php on line 8
Jos muuttujan kirjoittaa merkkijonon sisään, täytyy käyttää lainausmerkkejä.
Kirjoita siis näin:
echo "<input type=\"hidden\" name=\"foo\" value=\"{$muokkaus}\" />";
Tosiaan kaikki tiedot, joiden pitää siirtyä seuraavalle sivulle, täytyy lisätä lomakkeeseen piilokentiksi.
Tai sitten näin:
echo '<input type="hidden" name="foo" value="' . $muokkaus . '" />';
Tai näin:
print "<input type='hidden' name='foo' value='" . $muokkaus . "' />";
Kuinkakohan saisin foon muuttujaksi osoiteriviltä juuri sen hetkisen osoitteen?
<a href="../edit/index.php?foo=kansio>Linkki</a>
Yritin Ohjelmointiputkan haulla etsiä, ja löysin jotain vinkkiä:
<?php print_r($_SERVER); ?>
Mitenköhän tuota ihan käytännössä käytetään?
Onko tämä kaipaamasi osoite?
<?php echo $_SERVER['PHP_SELF']; ?>
<a href="../edit/index.php?foo= <?php echo $_SERVER['PHP_SELF']; ?> ">Muokkaa</a>
Piileekö tässä toteutuksessa jokin tietoturvariski?
Jos tuolla editoinnissa ei ole tarvittavia tarkistuksia, niin piilee.
Edit: niin ja tarkemmin ajatellen riippuu ihan täysin siitä mitä tuolla editissä teet.
Edit2: äh tuollahan se oli selvitetty jo aikasemmin. Menen pois.
<a href="../edit/index.php?foo= <?php echo $_SERVER['PHP_SELF']; ?> ">Muokkaa</a>
Tätä linkkiä painamalla pongahtaa esiin tarvittava tarkistus.
Onkos tuossa noi ylimääräiset rivinvaihdot tarkoituksella?
Tarkistin tiedoston, josta otin tuon. Ei siellä ollut ylimääräisiä rivinvaihtoja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.