Pitäisi saada siis PDF tiedostot niin että vain kirjautuneet voivan avata / tallentaa dokumentteja koneelleen ja estää lataus jos ei tule sivustojeni kautta. eli vaikka tietäisit suoran polun tiedostoon, niin et voi sitä ladata kirjautumatta ensin palveluuni. Miten tämä on järkevintä toteuttaa.
Tällä hetkellä tiedoston ovat Mysql tietokannassa (perus ID, nimi, url tyylillä)
eli vain polut ovat tallennettuna tietokantaan. Tiedostoja tulee olemaan useampi giga, joten niitä ei ymmärtääkseni ole järkevää sulloa sellaisenaan tietokantaan?
Miten näkisitte asian hoituvan?
Edit. Niin ja kielenä olen käyttänyt PHP:tä
.htaccess suojaa koko kansion.
esim.
AuthUserFile C:/salasanat/.htpasswd
AuthGroupFile /dev/null
AuthName "kirjoita tunnus ja salasana palveluun serveri"
AuthType Basic
<Limit GET>
require user tepi
require user topi
</Limit>
ja .htpasswd
-----
tepi:tepitys
topi:salasana
-----
tai kryptattuna
-----
tero:$apr1$n/AP4/..$tbQuDlNk0S55vgnawEddb/
Jos normaalisti tekee php-tiedoston, lukee tiedoston freadillä samalla tulostaen sisällön. Lisäksi tiedostojen kotihakemiston laittaa www-sivuston ulkopuolelle Esim. omaan kotikansiosi sisälle perustettavaan pdf-kansioon, johon luonnollisesti annat tarvittavat kirjoitus/luku oikeudet.
Includea ei kannata käyttää tulostamiseen tietoturvaongelmien takia.
Kiitos vastauksista.
Ymmärtääkseni peg:in tarjoama ratkaisu kysyy käyttäjältä uudelleen salasanaa vaikka on käyttäjä on jo kirjautunut sisään sivustooni. Tätä haluaisin välttää. Myös mietin että tuleeko minun sitten manuaalisesti / jonkun scriptin avulla muokata .htpasswd tiedostoa käyttäjien lisääntyessä / kadotessa?
peran: avaan tiedostot tällä hetkellä vastaavasti:
formi:
<form action='viewmanual.php' method='POST'><input type='hidden' value='kokeilu.pdf' name='id'><input type='submit' value='Katso manuskaa'></form>
viewmanual.php:
<?php .... $fileurl = $_POST['id']; $filename = 'docs/'.$fileurl; header("Pragma: public"); header("Expires: 0"); header("Pragma: no-cache"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-disposition: attachment; filename=' . basename($filename)); header("Content-Type: application/pdf"); header("Content-Transfer-Encoding: binary"); header('Content-Length: ' . filesize($filename)); @readfile($filename); exit(0); ... ?>
jos pistän tiedoston www kansion ulkopuolelle niin saako sen haettua kyseisellä koodilla käyttäjän silmille.
ja mitä tarkoitin includen käyttämisellä tulostamiseen? onko joku tietoturvaaukko jäänyt minulta mahdollisesti huomioimatta?
Ei se kysy käyttäjältä kuin kerran jos tiedostot ovat samassa kansiossa.
Suojaus koskee siis sitä kansiota jossa .htaccess on.
Minulla kun on jo kirjautumis järjestelmä olemassa.
Siinä jokaisella käyttäjällä on eri tiedostoihin oikeuksia jotka tarkastetaan aina enne tiedoston latausta ja linkin näyttämistä, eli eri käyttäjän näkevät eri tiedostot ja heidän ei myöskään pitäisi päästä käsiksi kuin vain tiedostoihin joihin heillä on oikeudet. Luonnollisesti :)
Tämä saattaa aiheuttaa ongelmia .htaccessin kanssa, ainakin siltä osin kun käyttäjämäärät lisääntyvät ja oikeuksien eri tiedostoihin hallinnoi? tai sitten olen jotain missannut. (Olen vasta tutustumassa .htaccessiin)
<?php .... $fileurl = str_replace("../","",$_POST['id']); $filename = '/home/stageradio/docs/'.$fileurl; if(isallowedtoread($filename)&&isfile($filename)) { header("Pragma: public"); header("Expires: 0"); header("Pragma: no-cache"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-disposition: attachment; filename=' . basename($filename)); header("Content-Type: application/pdf"); header("Content-Transfer-Encoding: binary"); header('Content-Length: ' . filesize($filename)); @readfile($filename); exit(0); } ... ?>
Tämän tilalle absoluuttinen osoite kotikansiossasi olevaan docs-kansioon, johon olet antanut kirjoitus-ja luku-oikeudet.
'/home/stageradio/docs/'
islogged() - on omatekemäsi funktio, jolla varmistat, että lukija on kirjautuneena. Luokkaa kannattaa käyttää käyttäjä-tietojen kapselointiin, joten se voisi mennä myös:
$user->islogged()
Edit - siis isallowedtoread():n tulisi palauttaa true, mikäli käyttäjä on kirjautuneena ja sillä on lukuoikeudet ko. tiedostoon ja false, mikäli käyttäjä ei ole kirjautuneena tai sillä ei ole lukuoikeuksia.
Edit - käytät tässä fileread-funktiota pdf:n tulostamiseen, jolloin ei ole ongelmia tietoturvan kanssa.
Edit3 - Tee myös taulu, jossa on tiedot, mitkä oikeudet on millekin käyttäjälle, mahdollisesti ryhmälle:
Siis taulusta löytyy sarakkeet:
filename :string
id:string
groupname:string
creatorsname:string
allowed:integer
allowed-stringi sisältää: 777-kaikille kaikki oikeudet tai
0-kellekään ei mitään oikeuksia. jne.
Jos käyttää oktaaleja, niin voi tutkia nopeasti bitti-operaatiolla onko oikeuksia ko. tiedostoon.
Kiitos vinkistä.
Viikonlopun jälkeen pääsen vasta kunnolla testaamaan käytännössä tätä metodia joten palaan asiaan sitten jos ongelmia tulee.
Kiitos.
peran kirjoitti:
<?php // ... tajuttomasti Content-Type-otsikoita ...
Jokainen HTTP-otsikko lähetetään vain kerran, joten noista Content-Type-riveistä tulee perille ainoastaan viimeinen, siis Content-Type: application/pdf. Turhaa työtä teet.
peran kirjoitti:
Jos normaalisti tekee php-tiedoston, lukee tiedoston freadillä samalla tulostaen sisällön. Lisäksi tiedostojen kotihakemiston laittaa www-sivuston ulkopuolelle Esim. omaan kotikansiosi sisälle perustettavaan pdf-kansioon, johon luonnollisesti annat tarvittavat kirjoitus/luku oikeudet.
Includea ei kannata käyttää tulostamiseen tietoturvaongelmien takia.
Includea voidaan käyttää jos includen sisällälle ei oteta syötteitä eli esim
<?php include("/home/seppo/pdf/testi.pdf"); ?>
On turvallinen
kun taas
<?php include($tiedosto); ?>
On tietoturvariski
tesmu kirjoitti:
Includea voidaan käyttää jos includen sisällälle ei oteta syötteitä eli esim
<?php include("/home/seppo/pdf/testi.pdf"); ?>On turvallinen
Ei ole. Lähes mikä tahansa täysin kelvollinen tiedosto voi sisältää PHP-koodia. Esimerkiksi kuvatiedostoissa on usein paikka kommenteille, ja vastaavia plain text -kohtia on vaikka missä. Mitäs, kun käyttäjä kirjoittaa JPEG-kuvan kommentiksi "<?php unlink('index.php'); ?>" ja yrität fiksusti lähettää tämän kuvan includella?
Siis includea pitää käyttää vain silloin, kun on tarkoitus ajaa PHP-koodia. Kaikissa muissa tilanteissa oikea funktio on jokin muu, esimerkiksi readfile.
Tähän tilanteeseen tuo on täysin turvallinen, jos kerran pdf-tiedostot ovat adminin laittavat.
Kannattaa myös kiinnittää huomiota peran esimerkissä esiintyvään suojaukseen:
<?php $fileurl = str_replace("../","",$_POST['id']) ?>
Tällainen on helppo ohittaa - esimerkiksi merkkijono /..././b muuttuu muotoon /../b. Syötteitä ei kannata pyrkiä "korjaamaan" oikeiksi, vaan selkeästi väärät syötteet on syytä hylätä suoralta kädeltä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.