Ajattelin tässä tehdä silleen kun nyt atk:ssa tehdään html sivuja, että jotkut meidän(kin) luokasta varmaan haluaa tekeleensä näkyville. Olempa siis kiltti ja teen seuraavat jutut:
Imageupload
CSSupload
HTMLupload
Ongelmana on se etten saa muokattua koodeja toimivikis, niin että imageupload päästäisi html sivut lläpi. CSS juttua en edes ole ehtinyt kokeilla. Ideana olisi siis että index.php sivulla olisi linkit sivuille imageupload, css upload, htmlupload ja ohje. CSS sivu tallentaa tiedostot kansioon CSS, HTML kansioon sivut ja kuvat kansioon Kuvat. Lataussivut olisivat kaikki kansiossa nettisivut, joka on pääkansiossa. Kuvalataus on jo. Hieman epäselvää mutta pistän havainnollistavan kuvan: http://sammakkopedia.jouluserver.com/index.php?
Kukaan ei varmaan huomannut viestiä, joten laitan "ilmoituksen". Voitte katsoa tilanteen osoitteeessa http://villejuhanigo.jouluserver.com/nettisivut/
Edit: ImageUpload on se kuvanlataus sivu
Viestistäsi ei käynyt mitenkään ilmi, mikä siinä muokkaamisessa on ongelmana. Jos et pysty osoittamaan selvää, yksittäistä ongelmaa, sinulle ei voi oikein antaa kuin yleisiä neuvoja: lue PHP-opassarjaa, jotta opit PHP:tä, koodivinkkejä (upload-aiheisia), jotta opit upload-hommat, ja tämä keskustelu, jotta opit, millaisia virheitä järjestelmään voi tulla, millaista tuhoa niillä saa aikaan ja miten ne voisi välttää.
Minulla on kansio www. siellä on kansio nettisivut. sinne pitäisi saada sivut Pageupload, jolla voi ladata html sivuja, jotka menee Sivut kansioon. Sinne pitäisi myös saada CssUpload joka lataa CSS sivuja CSS kansioon. UploadImage sivu on jo. En tajua yhtään noita uploadjuttuja. Yhenkin hyän uplooadkuvajutun muutin hyväksymään html sivuja muuttamalla kuvapäätteet html päätteeksi ja tarkistin monta kertaa.
Uploadauksen perusteet: Upload-formiin attribuutti enctype='multipart/form-data'
, ja input, jonka "type"-attribuutti on "file", ja "name" vaikkapa "tiedosto". Sen jälkeen saat tiedoston sisällön funktiolla file_get_contents($_FILES['tiedosto']['tmp_name']);
ja nimen muuttujasta $_FILES['tiedosto']['name'];
. Tiedostonimestä voit sitten tarkistaa päätteen, ja jos se on väärä, ohjaat käyttäjän komennolla header("Location: virhe.php");
haluamallesi virheilmoitussivulle.
Voit halutessasi joko copypastettaa koodit useammalle sivulle eri tiedostotyyppejä varten, ja tehdä tarvittavat pikkumuutokset.
luin tuon aika monta kertaa. Tajusin kohdat "Uploadauksen perusteet:". Siihen loppui se. Sitten tajusin tuon "Voit halutessasi joko copypastettaa koodit useammalle sivulle eri tiedostotyyppejä varten, ja tehdä tarvittavat pikkumuutokset.". Tajusin myös joitan pieniä osia, mutten yhtään koodia...
Otapa Googlella ensi töiksesi selville, mitä tarkoittavat HTML:ssä termit "attrubuutti" ja "tagi". Ja sen jälkeen, mitä tarkoittaa PHP:ssä termi "funktio".
tagi: <b>, <i>, <font color="red">...
attribuutti: <a href="..." abb="VilleJuhaniGO">VJGO (Vaatii css näpräilyä.)
Sitten teet HTML-koodin, jossa on form-tagi, jolla on attribuutti enctype='multipart/form-data'
. Sen sisään input-tagi, jossa on attribuutti type='file'
. Mikä jäi epäselväksi?
Sitten teet HTML-koodin, jossa on form-tagi, jolla on attribuutti enctype='multipart/form-data'
. Sen sisään input-tagi, jossa on attribuutti type='file'
. Mikä jäi epäselväksi?
hetkinen...
<form action="xxx ku tuo yks häirittee.php" method="get" abbr="enctype='multipart/form-data'"><input type="file" value="Lähetä tuo häiritsijä xxx!!!!!!!!">
Noinko...?
Mod. huom: Älä kiroile.
<form action="?" method="POST" enctype="multipart/form-data">
Mikä toi "?" on?
Uploadauksen käsittelevä PHP-tiedosto. Ja sit tosta puuttuu vielä submit-nappula
Sivu jolle tiedot lähetetään? Tuossa tapauksessa se on sivu jolla ollaan + kysymysmerkki (Esim. tiedosto.php?)
Tein sinulle hyvää hyvyyttäni esimerkin tiedostojen lataamisesta. Teet esimerkiksi kansion upload, johon alihakemiston uploads. Koodi luo jokaiselle käyttäjälle oman hakemiston uploads kansioon, johon hän voi laittaa tiedostoja tai poistaa niitä.
index.php
<?php error_reporting(E_ALL | E_NOTICE); session_start(); ob_start(); if(isset($_SESSION["user"])) { $mkoko = 5000000; // Max koko $hakemisto = "uploads/{$_SESSION["user"]}"; $sallitut = array("html", "php", "css", "jpg", "jpeg", "bmp", "gif", "htm"); // Sallitut tiedostopäätteet if(!is_dir($hakemisto)) mkdir($hakemisto); if(isset($_FILES["file"])) { global $hakemisto, $mkoko; $file_size = $_FILES["file"]["size"]; $file_name = $_FILES["file"]["name"]; $file_tmp_name = $_FILES["file"]["tmp_name"]; $file_type = $_FILES["file"]["type"]; if(file_exists($hakemisto . $file_name)) die("Samanniminen tiedosto on jo olemassa!"); if((int)$file_size > (int)$mkoko) die("Liian suuri tiedosto. Suurin sallittu koko on {$mkoko}Kb."); $pilkotut = explode(".", $file_name); if(!in_array($pilkotut[1], $sallitut)) die("Ei sallittu tiedosto!"); // Siirretään tiedosto kansioon move_uploaded_file($file_tmp_name, "$hakemisto/$file_name"); header("Location: index.php?onnistui"); } if(isset($_POST["poista"])) { if(file_exists($hakemisto . "/" . $_POST["poista"])) { unlink($hakemisto . "/" . $_POST["poista"]); header("Location: index.php"); die; } else die("Tiedostoa ei löytynyt!"); } ?> <form action="?" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <br> <input type="submit" value="Lataa"> </form> <form action="?" method="POST"> Poista tiedosto: <input type="text" name="poista"> <input type="submit" value="POISTA"> </form> <b>Tiedostot:</b> <ul> <?php $hakemisto = opendir("$hakemisto/"); $i = 1; while($tiedosto = readdir($hakemisto)) { if($tiedosto == "." || $tiedosto == "..") continue; echo "<li><a href=\"$hakemisto/$tiedosto\">$tiedosto</a></li>"; $i++; } ?> </ul> <?php } else header("Location: kirjaudu.php"); ?>
kirjaudu.php
<?php session_start(); ob_start(); if(isset( $_POST["tunnus"]) && isset($_POST["salasana"])) { $tiedosto = explode("\r\n", file_get_contents("kayttajat.txt")); $salasana = $_POST["salasana"]; $tunnus = $_POST["tunnus"]; for($i = 0; $i < sizeof($tiedosto); $i++) { $tjs = explode(":", $tiedosto[$i]); if($tunnus == $tjs[0] && md5($salasana) == $tjs[1]) { $_SESSION["user"] = $tunnus; header("Location: index.php"); die; } } die("Tunnus ja/tai salasana oli väärin!"); } ?> <table> <form action="?" method="POST"> <tr><td>Tunnus:</td><td><input type="text" name="tunnus"></td></tr> <tr><td>Salasana:</td><td><input type="password" name="salasana"></td></tr> <tr><td><input type="submit" value="Lähetä"></td></tr> </form> </table>
kayttajat.txt
Macro:e7e941b1f09f266540c6780db51d5f58
<html> <head> <title>Lataa sivu</title> </head> <body> <form action="?" method="POST" enctype="multipart/form-data"> <input type="file" value="tiedosto"> <input type="submit" value="Senddaa sivu">
Näinkö?
Mod. korjasi kooditagit
Muuten oikein, mutta ei kannata antaa file-inputille namen sijasta valueta. Lue esimerkkini ylhäältä.
Heh, en tiennytkään että is_dir() palauttaa falsen jos kansiota ei löytynyt. Oletin, että antaisi jonkin noticen.
Muuten, vilkaisin tuota etusivua nettisivuiltasi, ei ole hyvä idea laittaa jokaista lataussysteemiä erikseen!
Ok. Tuo kommentti valmiin koodin jälkeen (siis missä oli virhe) niin en huomannut että laitoit koodin koska kirjoitin tuota "koodia" silloin. Kiitos.
Edit: Ei toimi
Tuo esimerkkini ei toimi? Taisit tehdä jotain väärin.
Mitäköhän onnistuit änkemään sinne tiedostoon? Näyttäisitkös...
Nyt toimii. Mites teen tunnuksen'? Entä kävijät?
Kirjoitat kayttajat.txt tiedostoon tunnus per rivi tyyliin
Minä:md5 hashattu salasana
Sinä:md5 hashattu salasana
Hän:md5 hashattu salasana
Entä jos joku haluaa tehdä tunnuksen? Helpotetaan (virtuaali)elämää ja tehdään/etsitään/mennään sivulle, sossa tehdään hashattuja salasanoja ja sitten ne on hashattu (Ei hele mikä nimi XDD)
Eiks tossa Macron koodissa mene läpi kans sellaiset tiedostot, kuin dfgdssda.html.php, joka ajettais PHP-tulkin läpi?
horny the horrible kirjoitti:
Entä jos joku haluaa tehdä tunnuksen? Helpotetaan (virtuaali)elämää ja tehdään/etsitään/mennään sivulle, sossa tehdään hashattuja salasanoja ja sitten ne on hashattu (Ei hele mikä nimi XDD)
Teet erillisen tunnustenluontilomakkeen, joka lisää tiedostoon uuden tunnuksen. Salasanan md5-hashaus onnistuu funktiolla md5($teksti)
.
<?php if(isset($_POST["tunnus"]) && isset($_POST["salasana"])) { file_put_contents("kayttajat.txt", file_get_contents("kayttajat.txt") . "\r\n" . $tunnus . ":" . $salasana); header("Location: index.php"); die; } ?> <table> <form action="?" method="POST"> <tr><td>Tunnus:</td><td><input type="text" name="tunnus"></td></tr> <tr><td>Salasana:</td><td><input type="password" name="salasana"></td></tr> <tr><td><input type="submit" value="Lähetä"></td></tr> </form> </table>
Juhko kirjoitti:
Eiks tossa Macron koodissa mene läpi kans sellaiset tiedostot, kuin dfgdssda.html.php, joka ajettais PHP-tulkin läpi?
Entä sitten?
Macro kirjoitti:
Entä sitten?
Tiedoston tyypin tarkistuksesta ei ole hyötyä, jos sitä on noin helppo kiertää.
Juhko kirjoitti:
Teet erillisen tunnustenluontilomakkeen, joka lisää tiedostoon uuden tunnuksen. Salasanan md5-hashaus onnistuu funktiolla
md5($teksti)
.
Opettelen vasta php:tä. Kuinka teen tämän? Jos en pitäisi ohjelmoinnista, kone olisi tuolla lumihangessa kuin koulussa kaikki kirjani lattialla...
Horny The Horrible kirjoitti:
Juhko kirjoitti:
Teet erillisen tunnustenluontilomakkeen, joka lisää tiedostoon uuden tunnuksen. Salasanan md5-hashaus onnistuu funktiolla
md5($teksti)
.Opettelen vasta php:tä. Kuinka teen tämän? Jos en pitäisi ohjelmoinnista, kone olisi tuolla lumihangessa kuin koulussa kaikki kirjani lattialla...
https://www.ohjelmointiputka.net/oppaat/opas.
Vähän hei oma-aloitteisuutta..?
Juhko kirjoitti:
Macro kirjoitti:
Entä sitten?
Tiedoston tyypin tarkistuksesta ei ole hyötyä, jos sitä on noin helppo kiertää.
Ei se ole kiertämistä. Jos laitat esimerkiksi tiedoston video.mpeg sinne nimellä video.mpeg.php, niin se tulkattaisiin PHP:nä eikä minään muuna.
RQ kirjoitti:
https://www.ohjelmointiputka.net/oppaat/opas.
php?tunnus=phpj5
Vähän hei oma-aloitteisuutta..?
En tajua miten tuo auttaa ongelmassani.
Tarkoitin sitä, että jos .php-tiedostoja ei ole sallittu, niin koodia voi huijata kirjoittamalla nimeksi "dsfsd.html.php", jolloin se on palvelimen mielestä .php, mutta koodin mielestä .html. Pitäis siis lisätä vielä se kolmas parametri explode-funktiolle, vai mitenkäs se nyt menikään...
Horny The Horrible kirjoitti:
En tajua miten tuo auttaa ongelmassani.
Siten, että sen luettuasi osaat käsitellä tiedostoja ja koodata rekisteröitymislomakkeen ilman apua.
Juhko kirjoitti:
Tarkoitin sitä, että jos .php-tiedostoja ei ole sallittu, niin koodia voi huijata kirjoittamalla nimeksi "dsfsd.html.php", jolloin se on palvelimen mielestä .php, mutta koodin mielestä .html. Pitäis siis lisätä vielä se kolmas parametri explode-funktiolle, vai mitenkäs se nyt menikään...
Et taida ymmärtää nyt. Jos PHP tiedostot eivät ole sallittuja, niin ne eivät mene latauksesta läpi. Voi HTML-koodia kirjoittaa PHP tiedostoon, mutta se ajetaan kuitenkin PHP tulkin läpi. Toisinpäin se ei toimi.
Ainoa minkä haluan tietää on se, että kuinka saan tehtyä lomakkeen jolle syötetään salasana ja vastauksena on md5 hashattu salasana. Ja sen kuinka saan index.php:n näyttämään muutakin kuin virheilmoituksen kun sille menee ilman kirjautumista.
Enkös minä antanut esimerkin rekisteröitymisestä?
Horny The Horrible kirjoitti:
Ainoa minkä haluan tietää on se, että kuinka saan tehtyä lomakkeen jolle syötetään salasana ja vastauksena on md5 hashattu salasana.
Teet lomakkeen, jonka syötteen muutat hashiksi MD5:llä. Jos et oikeasti sitäkään osaa kaiken tämän jälkeen, niin lue nyt ihmeessä se koko PHP-opas ajatuksella alusta loppuun. Turha vaivata muita näinkin typerillä kysymyksillä. Jos et PHP-opassarjankaan jälkeen osaa sitä tehdä, on varmaan parempi oottaa pari vuotta ennen kuin yrität opetella ohjelmointia, ei millään pahalla <_<. Copy-pasteaminen kun ei ole ohjelmointia.
Horny The Horrible kirjoitti:
Ja sen kuinka saan index.php:n näyttämään muutakin kuin virheilmoituksen kun sille menee ilman kirjautumista.
Siis mitä....?
Ööh?
Aa, tarkoitit tuota. Anteeksi vain, ajattelin eritavalla. Ei kuitenkaan kannata laittaa lisää tarkistuksia, sillä niitä voi olla loputtomasti (Jos nyt tajusinkaan viestiäsi oikein).
Jos sen in_array tarkistusrivin korvaa tällä if(!in_array($pilkotut[sizeof($pilkotut) - 1], $sallitut))
, niin silloin pitäisi toimia.
Macro: Juhko on aivan oikeassa. Tarkistat vain $pilkotut-taulukon toisen elementin, eli a.b.c:stä tulee tarkistettua b. (Edit: hidas.) Oikea tarkistettava olisi end($pilkotut)
.
Lisäksi tuo explode-viritys file_get_contentsin kanssa on huono, koska Unixissa rivinvaihto on pelkkä \n ja (vanhassa) Macissa pelkkä \r. Parempi tapa olisi file("tiedostonimi", FILE_IGNORE_NEW_LINES). Toisaalta tuollaisessa tiedostomuodossa tulee myös ongelmia, jos esimerkiksi käyttäjänimi sisältää pystyviivan, joten kannattaisi ehkä harkita jonkinlaista enkoodausta. Esimerkiksi rawurlencode on helppo.
Siis häh?
Helpompi olis laittaa kolmas parametri explode:lle.
Molemmat tavat toimivat.
Macro kirjoitti:
Aa, tarkoitit tuota. Anteeksi vain, ajattelin eritavalla. Ei kuitenkaan kannata laittaa lisää tarkistuksia, sillä niitä voi olla loputtomasti (Jos nyt tajusinkaan viestiäsi oikein).
Ei niin, vaan kannattaa vaihtaa tarkistustapaa. Eli tarkistat vain tiedostonimen viimeiset merkit.
Horny The Horrible kirjoitti:
Siis häh?
Macron koodissa oli pikkubugi, jonka korjaamisesta keskustelimme.
Juhko: exploden kolmas parametri ei minusta ratkaise ongelmaa kovin hyvin, koska viimeinen pala sisältäisi loput tekstistä, jolloin a.php.html:stä tarkistettaisiin php.html ja tiedosto virheellisesti hylättäisiin.
Macro: in_array on yllä mainitusta syystä myöskin huono: eihän ole mitään syytä hylätä tiedostoa php.html.
Miten kirjaudun tuolta ulos? siis siltä latausjutulta
Metabolix > Korjaantuu, kun sijoittaa count-jutun if-lauseeseen.
Horny The Horrible kirjoitti:
Miten kirjaudun tuolta ulos? siis siltä latausjutulta
<?php $_SESSION['user']='';
Joo, enpä huomannut sizeoffia. Mutta siinähän on nyt bugi: taulukon viimeinen on sizeof($t)-1, ei suinkaan sizeof($t). (Jos joku ei tiedä, niin sizeof tekee saman kuin count.) Ehdottamani end($t) olisi joka tapauksessa lyhyempi ja selkeämpi.
Juhko kirjoitti:
Horny The Horrible kirjoitti:
Miten kirjaudun tuolta ulos? siis siltä latausjutulta
<?php $_SESSION['user']='';
Eipä taida toimia
<?php unset($_SESSION["user"]); session_destroy();
Joo hups. Unohdin sanoa että tarkistukseen pitäis liittää kans tarkistus siitä onko tyhjä. Paras tapahan olis tehdä kummatkin. ;)
Kiitos. Vaikkakin monta ongelmaa on ratkaisematta... Muuten... Tuonnehan voi ladata käytännssä mitä lystää. Nytki minä lataan tuota koodia muutettuna niin, että se sallii zip ja txt tiedostot. Sinnehän voi ladata mitä vaan XD
Aivan mahtavaa keskustelua! Hyvää viihdettä jokaisena iltana :>
Itse toteutan tiedostojen tarkistamisen niin, että katson viimeisen pisteen, jonka jälkeen tulee tunniste. Ongelmallista esimerkiksi mäkkiympäristössä ovat tiedostot, joilla ei ole päätettä. Itse jätän kyseiset tiedostot suoraan ulkopuolelle.
Mielestäni PHP myös tukee komentoa (joku versio), joka kertoo tiedoston päätteen suoraan tai millainen tiedosto se on. Tosin siinä oli viimeksi jotakin ongelmallista, joten jätin käyttämättä. En valitettavasti muista kyseistä komentoa.
reca kirjoitti:
Aivan mahtavaa keskustelua! Hyvää viihdettä jokaisena iltana :>
Lisää viihdettä löytyy wikipediasta. Sanoisinko että typerää tuollainen.
Ja tiedostopäätteen saa php:n funktiolla pathinfo. Sama funktio osaa selvittää muutakin kivaa tietoa (saa kattoa php.netistä).
temu92, oli tosiaan ihan mukavaa viihdettä. :):)
myös strrchr:llä onnistuu:
<?php $allowed_ext = array('jpg', 'png'); $extension = strrchr($tarkistettavatiedosto, '.'); if (in_array($extension, $allowed_ext)) { // jos arrayssa }
...jossa siis $tarkistettavatiedosto on se filu mitä sinne koitat sendaa
Löysin "bugin" koodista. Kun siitä linkistä painaa, jonka pitäisi mennä sille ladatulle sivulle, niin se vie jollekki veirdo sivulle.
Macro! Miksi minun salasana on sinun tiedostossasi? Vastaa! Sivusto on sekaisin sen latauksesi jäljiltä! Oon sitäpaitti nyt aika kiireinen joten selitä!
(Mod. korjasi viestin ulkoasun.)
Horny The Horrible: Käyttäydy kunnolla nyt. Älä HUUDA äläkä käytä useampaa kuin yhtä huutomerkkiä. Voit myös lähettää yksityiset viestit sähköpostilla suoraan asianomaiselle henkilölle, ei tarvitse kierrättää kaikkea foorumin kautta.
Olit näköjään tarpeeksi ymmärtämätön laittaaksesi salasanat tiedostoon kayttajat.txt, jonka kuka tahansa voi ladata. Ei pidä tehdä niin vaikeita asioita, ettei edes ymmärrä mahdollisia riskejä.
Joku voi ladata tuon salasanatiedoston ja arvaamalla kokeilla, tuottaisiko md5("salasana") oikean tuloksen. (Tuloksia on myös listattu valmiiksi joillekin sivustoille.) Tämän takia MD5-funktiota ei koskaan pidä käyttää ilman "suolaa" eli salasanaan lisättävää salaista tekstiä, jonka vain ylläpitäjä tietää. Kun salasanaan lisätään tuntematon osa, md5("salasana") antaa väärän tuloksen, koska tiedostossa lukeekin tarkiste md5("salasanaSALAINEN").
Edit: Juhko: käyttäydy sinäkin! Poistin jo neljä viestiäsi, enkä epäröi poistaa useampaakin, jos laatu ei parane. Isolla kirjoittaminen ja törkypuheet eivät ole asiallista käytöstä.
Keskustelu lukittu riehumisen vuoksi.
Aihe on lukittu, joten siihen ei voi vastata.