Eli kun käytössä on framet; valikko.php, yla.php ja sivu.php, jotka yhdessä siis muodostavat index.php sivun ja jossa sivu.php on pohja johon aukeaa kaikki sivut, jotka on avattu valikko.php:sta. Niin nyt kun halutaan suojata tuo sivu.php tiedosto, niin että jos osoiteriville kirjoitetaan suoraan www.domain.com/sivu.php tulostettaisiin käyttäjälle "pääsy kielletty", mutta jos framet on aktiivisina (eli käytännössä osoiterivillä lukisi www.domain.com/index.php) niin siinä tapauksessa sivu.php:n pystyy avaamaan normaalisti framen sisään.
Mitenköhän tämmöisenkin voisi toteuttaa? Oon jo jonkun aikaa miettiny kaikenlaisia vaihtoehtoja, mutta ei oikein mitkään toimi. Urin kanssa tuskin pystyy alkaa kikkailemaan, koska se palauttaa aina sivu.php:n urlin, eikä index.php:n. JavaScriptillä tämän saisi toimimaan, mutta sellaista en halua koska se on niin helposti kierrettävissä, eli ihan puhdas php säätö pitäis saada. Valmista skriptiä ei tarvii pistää, itse kyllä osaan sen tehdä kun vain keksisi tuon toimintaperiaatteen.
(Ja noista frameista ei nyt kannata alkaa whineemään.)
Jos vähän kikkailee, niin toimii seuraava konsti:
Laitat sivu.php:n kanssa samaan kansioon .htaccess-tiedoston (tai lisäät allaolevat rivit olemassaolevaan), jossa lukee:
<FilesMatch sivu.php> deny from all </FilesMatch>
Sen jälkeen sivu.php:hen ei pääse käsiksi suoraan, mutta skripti pystyy kuienkin sen noutamaan. Silloin sinun täytyy vain laittaa sivu.php include():n kautta sivuillesi.
Aikamoinen säätö tulisi kun ottaa huomioon, että sivuja on jo aikalailla ja en jaksaisi alkaa niitä kaikkia muokkailemaan ja testailemaan. Mielelläni käyttäisin jotain toista keinoa mikäli sellainen keksintään.
Varmaan jokin ihan yksinkertainen ratkaisu tähänkin ongelmaan on, tyyliin: valikko.php tiedostoon laitetaan $arvo = 1; ja sitten sivu.php:ssä tarkistetaan onko $arvo == 1, jos ei niin erroria jos on niin jatketaan. Tämähän ei tietenkään toimi, mutta vastaavanlaisella periaattella.. ya got the point?
Onko sinulla siis monia erilaisia sivu.php:ita? Voisit pistää vaikka sivun sorsan tänne niin saisi paremman kuvan asiasta.
No siis...
Tarkemmin ajatellen hieman huonosti selitin ton jutun. Eli framejen kanssahan homma menee niin (tässä tapauksessa), että sivu koostuu kolmesta osasta: Vasemmalla olevasta valikosta, ylhäällä olevasta "palkista" ja sitten lopun tilan vie se kohta mihin sivut aukeavat. Oletuksena aukeaa tuo sivu.php, mutta kun klikkaat menusta vaikka sivu2.php, niin sivu.php:n tilalle luonnollisesti aukeaa sivu2.php jne.
Sorsaa tässä ei nyt tarvitse ollenkaan kunhan ymmärtää tuon framejen idean.
Tähän voisi tietysti kehitellä dynaamisemmankin järjestelmän, mutta helpompi varmaan näin:
Siirrät kaikki sivu#.php-tiedostot yhteen kansioon, vaikka include/. Sitten teet siihen kansioon .htaccess-tiedoston jossa lukee:
deny from all
Seuraavaksi teet pääkansioon vaikka sivut.php-nimisen tiedoston, johon laitat rivit:
if(isset($_GET["sivu"])){ // jottei h4x0rit pääse aivan niin helposti sähläämään $sivu = strip_tags($_GET["sivu"]); $kansio = "include/": $tiedosto = $kansio.$sivu.".php"; if(file_exists($tiedosto)){ include($tiedosto); } else { include("include/sivu.php"); } } else { include("include/sivu.php"); }
Sen jälkeen laitat sivut.php:n siihen pääframeen, johon sisältö tulee, ja muokkaat linkit muotoon:
<a href="sivut.php?sivu=sivu1" target="framen_nimi">Sivu1</a>
Ymmärsitkö?
Ymmärsin juu, mutta kun ei se omassa tapauksessani toimisi tuolla periaatteella. Kun järjestelmässä on useita alikansioita tyyliin hakemisto/index.php, hakemisto2/hakemisto/index.php jne. Menee _hieman_ hankalaksi alkaa noita kaikkia muokkailemaan tuollaiseksi, ja tuon includenkin kanssa saisi jonkin aikaa säätää. Juuri tämän takia kysyinkin jos joku vain keksisi jonkun yksinkertaisen perusidean, jolla kyseinen suojaus voitaisiin toteuttaa.
Kiitos kuitenkin erittäin paljon vaivannäöstäsi.
tuo arvo=1-systeemi toimisi kyllä sinänsä, muttei kyllä sekään ilman include():n käyttämistä. Voi olla, että sinun pitää muuttaa sivujasi, jos haluat saada tällaisen pelaamaan.
lainaus:
tuo arvo=1-systeemi toimisi kyllä sinänsä, muttei kyllä sekään ilman include():n käyttämistä. Voi olla, että sinun pitää muuttaa sivujasi, jos haluat saada tällaisen pelaamaan.
Aivan, mutta eihän se voisi nopeasti ajateltuna includellakaan toimia. Sillä jos yla.php:ssä on määritelty $arvo = 1; niin eihän sitä tietoa saa sivu.php:hen kuin includettamalla yla.php. Ja jos kyseisen sivun includettaa, niin $arvo muuttujahan on aina 1.
Ja kyllä esimerkiksi tuollainen includettaminen onnistuisi, kun sivustossa on ns "runko" joka on includettu jokaiseen sivuun, joten kunhan includettaisin yla.php:n runkoon.
Mutta kuitenkin, varmasti joku kätevä tapa tähän on olemassa... ei vaan tunnu pulpahtavan mieleen yhtään..
Voisit tietysti luopua kokonaan frameista ja includettaa valikon ja yla.php:n vaikka taulukon soluihin.
lainaus:
Voisit tietysti luopua kokonaan frameista ja includettaa valikon ja yla.php:n vaikka taulukon soluihin.
Niin voisin, mutta en luovu. Kohta vuoden verran oon tota järjestelmää kasaillut, joten en todellakaan ala enää tässä vaiheessa sitä muokkaamaan. Noi framet on hemmetin kätevät, etenki jos ton avattavan sivun sais jotenkin suojattua. Vaikka onhan noissa huonotkin puolensa.
Pistä sivuun joka avataan jonkunlainen tarkistus että onko $_GET["ok"] = "ok" ja sitte muutat sivun linkin muotoon linkki.php?ok=ok
Helpottuu vielä jos teet tarkista.php:n ja sitte incluudetat sen sivuihin
Eikös JavaScriptillä pystyy tarkistamaan tämän? Joku asian osaava voisi varmaan kertoa miten se tehdään...
Kenkku, luuletko että sivu olisi sitten suojattu? Käyttäjähän voi avata sivun normaalisti tyyliin sivu.php?ok=ok.
nlampola, JavaScriptillähän sen saisi toimimaan. Mutta kun se on niin äärimmäisen helppo kiertää, joten en sitäkään mielelläni käyttäisi.
Siihen auttoi window.top.location mutta javascript on niin unohtunut että ei muotoudu alkeellisintakaan esimerkkiä.
Ennen kuin lähdet virittelemään mitään suurempia virityksiä, kannattaa muistaa että framet + php-koodilla toteutettu esto alasivujen selaamiseksi ilman frameja estää myös botteja tonkimasta sivustoasi. Ei siis kannata odottaa sivujen listautumista googleen tai mihinkään muuallekaan.
lainaus:
Siihen auttoi window.top.location mutta javascript on niin unohtunut että ei muotoudu alkeellisintakaan esimerkkiä.
Ennen kuin lähdet virittelemään mitään suurempia virityksiä, kannattaa muistaa että framet + php-koodilla toteutettu esto alasivujen selaamiseksi ilman frameja estää myös botteja tonkimasta sivustoasi. Ei siis kannata odottaa sivujen listautumista googleen tai mihinkään muuallekaan.
No onhan ko sivustolla "pääsivu", joka ei ole frameilla tehty ja sitten on tämä osio, johon nyt koitan saada tuota suojausta. Joten kyllä ne sivut googleen ja muuallekkin menevät.
Ja ei tuota javascriptiä kannata alkaa edes miettimään, se on yhtä tyhjän kanssa tässä tapauksessa. Riittää kun käyttäjä kytkee selaimen js tuen pois päältä hetkeksi.
No miksi se nyt pitää "suojata"?
lainaus:
No miksi se nyt pitää "suojata"?
No juuri siksi kun haluan sen olevan suojattu. Tälläiset kommentit voitais yhtä hyvin jättää sanomatta kun ne ei auta asiaa suuntaan eikä toiseen.
Jos jotenkin pystyisi tarkistamaan esim. indexin kautta onko top.php aktiivinen, tyyliin isset(top.php) niin tuonhan saisi toimimaan. Urin kanssakin se toimisi jos se osaisi palauttaa _indexin_ urlin, eikä avatun sivun urlin. Varmasti jokin keino tähän kyllä on...
Ilman frameja kyllä on mahdollista.
lainaus:
Ilman frameja kyllä on mahdollista.
No miten se nyt voisi olla mahdollista? Jos sivu avataan linkistä, niin mistä se tietää kuuluuko sen olla suojattu vai ei? Et ilmeisesti ole ymmärtänyt aivan oikein tämän viritelmän tarkoitusta.
Listataan tähän nyt joitain vaihtoehtoja (kaikki vaihtoehdot vaatii että tarkistus tehdään muissa sivustoissa pl. indeksisivu):
- Indeksisivussa sessionmuuttujan asetus. Jos ei löydy => header("location: http://www.omasivu.net/kehys/index.php");
- Jos $_SERVER['REQUEST_URI'] != "/kehys/index.php" => headeri
- Parametrin välitys indeksisivun linkeissä. Jos $_GET['parametri'] != "lataudunkehyksiinolehyväkiitosvaan" => headeri
- Alasivujen suojaus .htaccessilla. linkit kutsutaan tyyliin kehys.php?sivu=1 ja switch/casella noudetaan oikea data includella kehys.php
Nämä nyt ainakin nopeasti mietittyinä saattaisivat toimia.
Hyvä hyvä, alkaa tulemaan jo järkeviä vastauksia, mutta mutta...
1) Jos sessionmuuttujan asettaa indexissä, niin eikös se ole voimassa niin kauan kunnes kirjaudutaan ulos, tai suljetaan selain. Eli käytännössä sen jälkeen kun olet ladannut indexin, voit siirtyä sivu.php:hen vapaasti?
2) Tuota olen itsekkin koittanut, mutta jos tuon request_urin laittaa sivu.php:hen, se ottaa aina arvoksi /kehys/sivu.php". Jolloin iffi on aina false... ei mutta hitto :) Jos se on aina false, ei sivu.php:hen koskaan pääse vaan syntyy loputon looppi, mutta hieman muokkaamalla tuota esimerkiksi => header("location: http://www.domain.com/kehys/$sivu.php"); ja sitten $sivu pitäisi tarkistaa vaikkapa linkistä. Pitää testailla tuota, jos se toimii niin kiitos ja kumarrus. :)
Jatketaan nyt vielä tuota poiskarsimista kuitenkin.
3) Tuosta mainittiin jo aiemminkin, ja tuohan on naurettavan helppo kiertää, joten ei sekään olisi hyvä.
4) .htaccessikin käsiteltiin jo.
Täytyy myöhemmin vielä testailla tuota falseksi määrittämistä.
Äh, eipä tuokaan oikein toimi.
Se joko tekee loputonta looppia tai sitten ei mitään... ;/
Edit: Jos jotenkin saisi _osoiterivillä_ olevan urlin haltuun, niin homma olisi itsestään selvä. Urilla sitä ei siis saa, ainakaan tietääkseni, vaan uri palauttaa aktiivisen sivun urlin. Mutta jos joku siis tietää onko kyseisen urlin/polun hakeminen edes mahdollista php:llä niin olisi hyvä jos jotain inffoa pistäisi.
Pistä vaikka kaikki tiedostos salattuun hakemistoon, sitten includaat ne PHP:llä sieltä, eikä kukaan muu pääse niihin käsiksi kuin sinun PHP-scriptisi.
lainaus:
Pistä vaikka kaikki tiedostos salattuun hakemistoon, sitten includaat ne PHP:llä sieltä, eikä kukaan muu pääse niihin käsiksi kuin sinun PHP-scriptisi.
Kolmas kerta...
Aihe on jo aika vanha, joten et voi enää vastata siihen.