Tarvitsen apua seuraavaan ongelmaan
Minulla on laite, joka kerää mittaustietoa. Se on kytkette lan verkkoon.
Laite pystyy lähettämään Http post menetelmällä mittaustiedot annettuun url oosoitteeseen osoitteeseen voi antaa myös tiedoston nimen, jolle tiedot annetaan.
Tämä toimii ilman salasanoja ja tunnuksia anonymous osoitteeseen.
Tämä ei ole mahdollista. Mukana on scripti, joka mahdollistaa kuitenkin tietojen lukemisen, jolloin tiedo tulevat uploads kansioon.
Mikä osoite pitää antaa laitteelle, jotta se löytää tuon scriptin vastaanottopäässä?
Yksi vaihtoehto on käyttää avointa ji-rajapintaa osoitteesta:
http://javLaimbEsill.se?pswd={tähän_salasana}
Se on hieman hidas vain aika ajoin..
Miten tätä käytetään?
Minun pitää kirjoittaa siihen POST tietoon URL johon haluan tiedoston menevän.
Mitä kirjoitan siis tuohon URL:ksi?
Urpojp kirjoitti:
Laite pystyy lähettämään Http post menetelmällä mittaustiedot annettuun url oosoitteeseen osoitteeseen voi antaa myös tiedoston nimen, jolle tiedot annetaan.
Tämä toimii ilman salasanoja ja tunnuksia anonymous osoitteeseen.
Kuulostaa jokseenkin riskaabelilta. Mitä tapahtuu, kun joku ohjelmoi (tahallaan tai vahingossa) client-skriptin, joka lähettää a) dataa 1 mikrosekunnin välein tai b) teratavun dataa?
lainaus:
Tämä ei ole mahdollista.
Siis toimii mutta ei ole mahdollista??
lainaus:
Mukana on scripti, joka mahdollistaa kuitenkin tietojen lukemisen, jolloin tiedo tulevat uploads kansioon.
Jos kristallipalloni näyttämä (kovin himmeä) kuva on suunnilleen oikea, niin haluaisit saada datat ”suoraan jonnekin”, mutta sinulle on annettu vain skripti, joka ottaa ne vastaan ja tallentaa tiettyyn kansioon (etkä voi, osaa tai halua tehdä muunlaista skriptiä). Tuollainen skripti on tietysti astetta (tai asteen puolikasta) vähemmän turvaton, koska tyypillisessä virhe- tai väärinkäyttötilanteessa se aiheuttaa ”vain” tietyn muistilaitteen täyttymisen. Ja kenties siinä on jopa joitakin tarkistuksia datan määrälle tai lähetysten frekvenssille; koodistahan emme ole nähneet vilautustakaan.
lainaus:
Mikä osoite pitää antaa laitteelle, jotta se löytää tuon scriptin vastaanottopäässä?
Tämä riippuu ihan siitä, millä tiedostonnimellä skripti asennetaan ja mihin kansioon palvelimessa ja mikä HTTP-palvelimen tiedostorakenne on. Se, saako tämä aikaan skriptin suorittamisen, riippuu palvelimen asetuksista.
Alla on scripti, jonka avulla pitäisi olla mahdollista ladata tuon laitteen lähettämää tiedosto. Osaako joku päätellä miten se toimii ja miten sitä käytetään?
<?php # owPostTest.php if ($_GET['action'] == 'RESET' ){ echo '<HTML> Resetting uploads directory.</html>'; $mask = "*"; array_map( "unlink", glob( "uploads/" . $mask ) ); exit (); } echo '<HTML> Here is what I received:<br>'; echo '<pre>'; print_r($_FILES); readfile($_FILES['owServerData']['tmp_name']); move_uploaded_file($_FILES['owServerData']['tmp_name'], "uploads/" . date("Ymd\THis-") . basename($_FILES['owServerData']['name'])); echo '</pre>'; echo '</html>'; ?>
Mod. lisäsi kooditagit!
Kuten Yucca jo ihmetteli, mikä ”ei ole mahdollista”? Itse epäilen, että ainakaan tiedostonimen antaminen laitteelle ei ole mahdollista, vaan pitää antaa HTTP-osoite.
Jotta skripti ”löytyisi”, skripti pitää laittaa jollekin tavoitettavissa olevalle palvelimelle laitteelle pitää antaa oikea HTTP-osoite. Skripti ei lue laitteelta tietoja, vaan laite lähettää skriptille tietoja, jotka skripti sitten tallentaa tiedostoihin.
Tuo skripti on huono. Hakkeri voisi lähettää skriptillä palvelimelle omaa PHP-koodia. Lisäksi skriptissä tulostetaan kaikki saatu data myös takaisin lähettäjälle, mikä on tarpeetonta ja vain hidastaa toimintaa.
Parempi skripti olisi vaikka tällainen:
<?php header("Content-Type: text/plain"); # Tarkastetaan salasana osoitteesta (skripti.php?password=salasana). if (@$_GET["password"] !== "salasana") { http_response_code(403); die("Forbidden"); } # Tarkastetaan, että tiedosto on lähetetty oikeasti. if (@$_FILES['owServerData']['error'] !== UPLOAD_ERR_OK) { http_response_code(403); die("Bad upload"); } # Muutetaan tiedostonimi turvalliseksi: poistetaan erikoismerkit. $name0 = $_FILES['owServerData']['name']; $name1 = substr(preg_replace('/[^A-Za-z0-9]/s', '_', $name0), 0, 20); # Laitetaan nimen alkuun uploads/ ja aikaleima ja loppuun .txt. list($t_usec, $t_sec) = explode(" ", microtime()); $t_usec = sprintf("%06d", $t_usec * 1e6); $date = date("Ymd.His", $t_sec); $path = "uploads/{$date}.{$t_usec}.{$name1}.txt"; # Yritetään tallentaa tiedosto muodostetulla nimellä. echo "Saving '{$name0}' to '{$path}'\n"; @mkdir("uploads", 0700); $ok = move_uploaded_file($_FILES['owServerData']['tmp_name'], $path); # Tallennetaan lokitieto. $log = date("Y-m-d H:i:s"). ": $path = $name0" . ($ok ? " OK" : " FAILED!"); file_put_contents("uploads.log", "$log\n", FILE_APPEND | LOCK_EX); echo $log;
Skripti pitää laittaa PHP:tä tukevalle palvelimelle (esimerkiksi nettiin webhotelliin tai kotiverkkoon jollekin koneelle), ja laitteelle pitää antaa skriptin HTTP-osoite, jonka loppuun tulee vielä ?password=salasana. Kannattaa vaihtaa salasanaksi pitkä, satunnainen merkkijono.
Nettisivujen tekemisestä ja palvelimen hankkimisesta kerrotaan oppaissa.
Siis minulla on laite, joka osaa lähettää tiedoston annettuun url osoitteeseen.
Siihen ei ole mahdollista antaa erikseen salasanaa, vain tuo osoite.
Jotenkin minun pitäisi saada tuo tiedosto tallennettua.
Siis jos annan osoitteeksi http://www.firma.fi/tiedot/testi.php?password=xyz985
Niin jos tuo sinun scriptisi on nimeltään testi.php ja sijoitettu kansioon tiedot, niin homman pitäisi toimia?
Urpojp
Hieno juttu! Tuo scripti toimii. Taidan vielä lisätä siihen tiedoston koon testauksen, koska vastaanotettavat tiedostot ovat pieniä.
Urpojp
Aihe on jo aika vanha, joten et voi enää vastata siihen.