Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Linkin mukana tietoa (PHP)

Sivun loppuun

OskariB [27.08.2007 22:49:56]

#

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.

Sami [27.08.2007 22:57:53]

#

<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.

OskariB [27.08.2007 23:21:32]

#

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.

Grez [28.08.2007 00:22:25]

#

Juu, ei missään tapauksessa noin, tuohon kun heittää fooksi jotain sopivaa niin pääsee lukemaan vaikka mitä. Ja muutenkin se olisi {$_GET["foo"]}

OskariB [28.08.2007 09:20:24]

#

<a href="../edit/index.php?foo=kansio>Linkki</a>

<?php
$muokkaus = $_GET['foo'];
$tiedosto = "../($muokkaus)/index.php";
?>

Näyttääkö yhtään paremmalta?

GimPeltzi [28.08.2007 09:38:14]

#

Kyyllä noin. Muista aina tarkistaa $_GET -taulukon sisältö väärinkäytön varalta, koska käyttäjä voi laittaa siihen mitä vain.

ajv [28.08.2007 09:55:34]

#

Ja muuttuja merkkijonon sisällä kaarisulkeisiin, ei normaaleihin sulkuihin.

Grez [28.08.2007 10:58:11]

#

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)

OskariB [28.08.2007 15:32:24]

#

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'>";
?>

TsaTsaTsaa [28.08.2007 15:43:47]

#

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']

OskariB [28.08.2007 16:02:42]

#

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

Antti Laaksonen [28.08.2007 16:21:08]

#

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.

moptim [28.08.2007 16:44:19]

#

Tai sitten näin:

echo '<input type="hidden" name="foo" value="' . $muokkaus . '" />';

Olga [28.08.2007 17:54:11]

#

Tai näin:

print "<input type='hidden' name='foo' value='" . $muokkaus . "' />";

OskariB [29.08.2007 13:33:28]

#

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?

Antti Laaksonen [29.08.2007 13:52:07]

#

Onko tämä kaipaamasi osoite?

<?php
echo $_SERVER['PHP_SELF'];
?>

OskariB [29.08.2007 14:45:13]

#

<a href="../edit/index.php?foo=
<?php
echo $_SERVER['PHP_SELF'];
?>
">Muokkaa</a>

Piileekö tässä toteutuksessa jokin tietoturvariski?

ajv [29.08.2007 17:09:58]

#

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.

OskariB [29.08.2007 17:24:07]

#

<a href="../edit/index.php?foo=
<?php
echo $_SERVER['PHP_SELF'];
?>
">Muokkaa</a>

Tätä linkkiä painamalla pongahtaa esiin tarvittava tarkistus.

Lebe80 [29.08.2007 18:25:31]

#

Onkos tuossa noi ylimääräiset rivinvaihdot tarkoituksella?

OskariB [29.08.2007 21:03:36]

#

Tarkistin tiedoston, josta otin tuon. Ei siellä ollut ylimääräisiä rivinvaihtoja.


Sivun alkuun

Vastaus

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

Tietoa sivustosta