Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: pdf tiedosto vain kirjautuneiden käytössä. miten?

Sivun loppuun

stageradio [04.09.2009 08:03:52]

#

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ä

peg [04.09.2009 08:17:34]

#

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

peran [04.09.2009 08:20:22]

#

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.

stageradio [04.09.2009 08:37:21]

#

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?

peg [04.09.2009 09:21:16]

#

Ei se kysy käyttäjältä kuin kerran jos tiedostot ovat samassa kansiossa.
Suojaus koskee siis sitä kansiota jossa .htaccess on.

stageradio [04.09.2009 09:33:41]

#

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)

peran [04.09.2009 09:41:26]

#

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

stageradio [04.09.2009 09:49:30]

#

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.

Metabolix [04.09.2009 12:19:30]

#

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.

tesmu [04.09.2009 15:49:39]

#

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

Metabolix [04.09.2009 17:25:49]

#

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.

tesmu [04.09.2009 18:24:55]

#

Tähän tilanteeseen tuo on täysin turvallinen, jos kerran pdf-tiedostot ovat adminin laittavat.

Contraband [04.09.2009 19:32:01]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta