Beveiligde map benaderen
Aangezien op de PDF-bestanden klant gegevens staan wil ik dit zo goed mogelijk beveiligen.
Een beveiligde map leek mij het handigst, maar ik kom er maar niet achter hoe ik deze middels PHP ( zonder dat de klant inloggegevens (nogmaals) in hoeft te voeren!! ) kan benaderen.
Toen dacht ik dat ik misschien met CHMOD() kon gaan werken. Hoe weet ik niet precies, en ik weet ook niet in hoeverre dit veilig is...
Heeft iemand een oplossing voor mij?
Om de pdfjes dan als download aan je klanten aan te bieden, gebruik je een PHP script. Bijvoorbeeld zo een als dit push download script. Voordeel is dat je in het betreffende PHP script direct een controle in kunt bouwen of de klant en ingelogd is en of de betreffende klant het opgevraagde pdfje wel mag downloaden...
Met de huidige klant gegevens een .htpasswd generen, deze koppelen via .htaccess. En dan laten linken met $_SERVER['PHP_AUTH_USER'] en $_SERVER['PHP_AUTH_PW']
Daarvoor zul je nog een extra controle (met PHP) uit moeten voeren en dan ligt de oplossing die ik in mijn vorige post gaf veel meer voor de hand...
Blanche schreef op 26.01.2009 22:49:
Daarvoor zul je nog een extra controle (met PHP) uit moeten voeren en dan ligt de oplossing die ik in mijn vorige post gaf veel meer voor de hand...
Daarvoor zul je nog een extra controle (met PHP) uit moeten voeren en dan ligt de oplossing die ik in mijn vorige post gaf veel meer voor de hand...
Check, idd. Alleen buiten de webroot plaatsen lukt vaak niet bij een hoster, ten zij je een VPS hebt.
Dat is onzin! Jij kunt gewoon mappen aanmaken naast de public_html (of htdocs/www/etc) map en voila je bent al buiten de webroot. Als je bij een host zit die dat niet toelaat, zou ik echt overwegen om een andere host te zoeken...
anders misschien met .htacces gewoon deny from all doen, dan kan je er vanaf web niet meer bij en jij met php nog wel.
Bouw er een loginsysteem omheen, de bestanden buiten de webroot houden en dmv php ophalen. Veiliger kan nog maar op 1 manier, en dat is uitprinten en opsturen per post!
Optie die blanche aangedragen heeft ben ik aan het uitproberen.
Ik heb downloadscript geintegreerd, en de map in de root gezet waar ook public_html staat.
Maar wat moet ik nou invullen bij $sDir?
Het script wat is dus gebruik is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require '../../inc/stats.php';
function getFile($sLocation, $sName)
{
if(!file_exists($sLocation) || strstr($sLocation, '../'))
{
echo "<script>alert('Dit bestand bestaat niet.');</script>";
}
else
{
header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header ('Content-Description: File Transfer');
header ('Content-Type: application/octet-stream');
header ('Content-Length: ' . filesize($sLocation));
header ('Content-Disposition: attachment; filename=' . basename($sName));
readfile($sLocation);
}
}
$sDir = 'downloadscript/';
if(isset($_GET['file']))
{
$sFile = trim($_GET['file']);
if(!empty($sFile))
{
getFile($sDir.$sFile, $sFile);
}
}
[/code]
ik heb wat dingen geprobeerd zoals teruggaan met ../../ etc. maar dat werkt niet. ook heb domains/[i]domeinnaam[/i] geprobeerd, werkt ook niet.
Hoe werk dat?
En die 1e 3 regels.. wat zou ik met stats.php moeten doen?
Volgens mij kan ik de 1e 3 regels gewoon weg laten ,of niet?
Sorry, weet hier niet zoveel van zoals jullie merken!
Bedankt voor alle reacties tot nu toe :)
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require '../../inc/stats.php';
function getFile($sLocation, $sName)
{
if(!file_exists($sLocation) || strstr($sLocation, '../'))
{
echo "<script>alert('Dit bestand bestaat niet.');</script>";
}
else
{
header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header ('Content-Description: File Transfer');
header ('Content-Type: application/octet-stream');
header ('Content-Length: ' . filesize($sLocation));
header ('Content-Disposition: attachment; filename=' . basename($sName));
readfile($sLocation);
}
}
$sDir = 'downloadscript/';
if(isset($_GET['file']))
{
$sFile = trim($_GET['file']);
if(!empty($sFile))
{
getFile($sDir.$sFile, $sFile);
}
}
[/code]
ik heb wat dingen geprobeerd zoals teruggaan met ../../ etc. maar dat werkt niet. ook heb domains/[i]domeinnaam[/i] geprobeerd, werkt ook niet.
Hoe werk dat?
En die 1e 3 regels.. wat zou ik met stats.php moeten doen?
Volgens mij kan ik de 1e 3 regels gewoon weg laten ,of niet?
Sorry, weet hier niet zoveel van zoals jullie merken!
Bedankt voor alle reacties tot nu toe :)
Jouw voorbeeld is eng, en onveilig. Ik kan nu namelijk ook je index.phps of databasecode ophalen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$map = 'pdfs/';
if(!empty($_GET['pdf']))
{
$pdf = $_GET['pdf'];
$pdfs = glob($map.'{*.pdf,*.PDF}', GLOB_BRACE);
if(in_array($map.$pdf, $pdfs))
{
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/pdf" );
header("Content-Disposition: attachment; filename=\"".$pdf."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($map.$pdf));
readfile($map.$pdf);
}else{
echo '<p>Sorry, dit bestand bestaat niet!</p>';
}
}else{
echo '<p>Sorry, ik verwacht een bestand!</p>';
}
?>
$map = 'pdfs/';
if(!empty($_GET['pdf']))
{
$pdf = $_GET['pdf'];
$pdfs = glob($map.'{*.pdf,*.PDF}', GLOB_BRACE);
if(in_array($map.$pdf, $pdfs))
{
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/pdf" );
header("Content-Disposition: attachment; filename=\"".$pdf."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($map.$pdf));
readfile($map.$pdf);
}else{
echo '<p>Sorry, dit bestand bestaat niet!</p>';
}
}else{
echo '<p>Sorry, ik verwacht een bestand!</p>';
}
?>
Dit voorbeeld werkt met een map 'pdfs', in dezelfde 'map' als deze 'download.php'. Die 'download.php' spreek je vervolgens aan met een ?pdf=bestandsnaam.pdf. Hierin kun je dan nog controleren of de gebruiker ingelogd is en rechten heeft om 'die' pdf op te halen.
Je kunt die map met pdfjes vervolgens op 2 manieren beveiligeren; een deny from all of hem buiten je webroot plaatsen. In het laatste geval zul je de $map moeten aanpassen naar de juiste locatie, doormiddel van de ../../ methode of de directe locatie.
ik krijg ook deze melding nu:
Warning: in_array() [function.in-array]: Wrong datatype for second argument in /home/etc./etc/etc/file.php on line 9
Gewijzigd op 01/01/1970 01:00:00 door Jer Tie
Wat denk je dat er gebeurd met een CHMOD 000? Juist, -niemand- kan nog bij de bestanden. Ook jij en PHP niet meer. Van wie heb je dit soort dingen geleerd? In je startpost wou je ook al aan de slag met CHMOD...
Ik dacht met CHMOD kan je m niet meer bereiken, dus deny from all? (A)
Verkeerde gedachte blijkbaar...
sorry
Zodra je de map met pdfs buiten je webroot hebt staan is deze al niet meer van buitenaf te bereiken. Een .htaccess met deny from all heeft in dat geval dus ook totaal geen nut meer...
oke!! ja, klinkt logisch :)