Synology-Forum.nl
Overige software => Web Station => Topic gestart door: a.m.j.janssen op 08 juni 2020, 14:47:36
-
Hallo,
ik heb een webapplicatie (PHP/MySQL) op mijn NAS en die werkt prima.
Eén ding moet ik nog oplossen: een webapplicatie staat standaard onder de map 'web' op de NAS.
Hoe kan ik nu een bestand openen dat 'hoger' in de mapstructuur ligt, bijv in een 'home'-map van een gebruiker.
Welke machtiging moet ik nu aan wie/wat toekennen?
mvg
-
Je kan vanuit de webmap naar elk bestand linken met een symbolic link.
Dat doe je met o.a Terminal.app op de Mac of met Putty op Windows.
Het is het UNIX commando: symlink
Navigeer naar de webmap en dan dit :
ln -s source_file myfile
source_file is de link naar het bestand en myfile is de symlink in de webmap.
Je moet wel rechten hebben om erbij te kunnen.
Maar dat staat hier verder buiten.
Op de NAS is het dan zoiets:
ln -s /volume1/homes/john/WebPictures/ webpictures
of naar de Photo map
ln -s /volume1/photo/Friends/ Friends
In UNIX ziet een aangemaakte symlink er dan zo uit:
Friends -> volume1-photo-Friends
Vanuit de webserver bezien is het gewoon een map.
Een symlink is niet altijd zichtbaar als je de webmap bekijkt in de Finder/Verkenner.
Je moet dus onthouden dat je 'm hebt.
https://kb.iu.edu/d/abbe
Ik heb er ooit een pagina aangewijd.
Misschien niet meer up to date maar de strekking klopt nog.
http://bytes.egestas.net/tech/getfiles/
-
Woow! Hartstikke bedankt voor je uitleg en je moeite, maar helaas ben ik absoluut geen unix-kenner.
Ik probeer vanuit mijn php-applicatie een bestand te openen dat buiten de standaard 'web'-map ligt, dwz erboven en niet eronder.
Bijv uit de home-map van een gebruiker of uit een gedeelde map. Dat moet haast wel met machtigingen te maken hebben, dacht ik zo...
Bvd en mvg
-
Met puur php gaat je dat niet lukken. PHP is alleen gebonden aan zijn www map en kan iet bij andere mappen op de server.
Je moet trouwens ook niet willen dat php toegang krijgt tot andere mappen dan je www-map, dit levert een veiligheidsrisico op.
-
Kom kom,
Niet zo pessimistisch.
Effe oefenen.
Zo doe ik het op een ipad.
Minuut werk.
-
André PE1PQX,
Ik neem aan dat je de map 'web' bedoelt.
Het moet met php toch mogelijk zijn dat ik een .csv-file van een gebruiker importeer naar de MySQL-database?!
Vanuit de map 'web' en daaronder lukt dat ook, maar ik wil graag een file importeren vanuit de omgeving van de gebruiker.
Vanuit zijn home-dir bijv of vanuit een gedeelde map.
Mvg
-
Een bestand benaderen buiten de web-map met PHP is een security risk. Ik zou dat zeker niet willen.
Betere optie is door een script automatich dat .csv bestand naar een bepaalde sub-map (ook niet in de root van web!) in de web-map te laten copieren en dan deze daarvandaan te laten benaderen.
Met PHP kunnen kwaadwillenden ook config bestanden bewerken als deze benaderbaar zijn.
-
…dat buiten de standaard 'web'-map ligt, dwz erboven en niet eronder.
Geen van beide. De home zit 'ernaast'. Home is heel netjes gescheiden van het webgebeuren. Eigenlijk een parallelle wereld waartussen je een 'Einstein–Rosen bridge' creëert met de methode van Wyodor.
-
Als een symlink geen keuze is, kan je het zo oplossen :
<?php
$csv = file_get_contents('/volume1/homes/gebruiker/Bestanden/nationality.csv');
echo '<pre>' . $csv . '</pre>';
?>
-
Hoi,
Helaas ook hiermee: "Permission denied".
Maar welke machtiging ik nu waaraan moet geven, geen idee.
-
Helaas kan ook lezen uit 'Home' niet vanuit 'web'.
De oplossing zit in gebruik van 'LOAD DATA', maar daarvoor moet dus php.ini worden aangepast. Maar hoe kom ik erbij?
Warning: mysqli_query(): LOAD DATA LOCAL INFILE forbidden in /volume1/web/fev/invoeren2.php on line 54 The user update failed: LOAD DATA LOCAL INFILE is forbidden, check mysqli.allow_local_infile
gr
-
Dit lukt :
<?php
$db = new mysqli( '127.0.0.1:3307', 'user', 'password', 'database');
$db->options( MYSQLI_OPT_LOCAL_INFILE, TRUE );
$query = "LOAD DATA LOCAL INFILE '/volume1/homes/developer/Bestanden/nationality.csv'
INTO TABLE table_ex
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
(id, nationality);";
$result = $db->query($query);
if ($result) {
echo 'ok';
} else {
echo 'niet ok';
}
?>
Dit is het csv bestand. Let op de | als veldscheiding.
id|nationality
1|Belgian
2|English
3|French
bron o.a : https://stackoverflow.com/a/16778796
-
Om de regel met veldnamen te negeren, een extra instruktie toegevoegd.
$query = "LOAD DATA LOCAL INFILE '/volume1/homes/developer/Bestanden/nationality.csv'
INTO TABLE table_ex
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, nationality);";
-
Beste Wyodor,
Als ik het goed begrijp moet hiervoor een aanpassing in php.ini worden gedaan (zie vorige bericht)
Dat zou moeten kunnen met WinSCP, dat ga ik nu proberen.
Alvast bedankt.
mvg
-
Als je hiervoor kiest (en idd security! Alert! Pas op!) kun je met Webstation - PHP instellingen - jouw PHP versie - Knop Bewerken - Algemene instellingen de PHP openbase_dir aanpassen. Hoeft dus niet via php.ini.
-
Hallo,
ik ga het proberen. Kun je me aub uitleggen wat die "openbase_dir" precies is?
Heb er nog eens over gelezen, maar begrijp niet goed wat ik ermee moet/kan.
Het betreffende veld is nu leeg, welke waarde heeft "openbase_dir" dan nu?
Bvd en mvg
-
De PHP code om een csv bestand te tonen en te importeren die ik eerder heb gegeven, werkt bij mij zonder iets in te stellen.
Het openbasedir veld bij de PHP instellingen is leeg.
Probeer het eens met een csv bestand in de web map zelf.
Dus zonder de lange path naam naar een andere map.
En dan uitbreiden naar andere mappen/directories.
-
Wyodor,
Het importeren vanuit de web-map zelf (of een map daarin) werkt ook prima.
Het gaat er juist om om te importeren van buiten de web-map.
Bijv vanuit een gedeelde map of vanuit een home-map van een gebruiker, maar dat lukt niet.
Waar dient openbasedir voor?
mvg
-
Waar dient openbasedir voor?
Daar vul je de pathnaam buiten de web map in waar PHP bij mag.
Ik weet niet meer precies hoe de notatie was.
Ik dacht zoiets:
/volume1/homes/naam/;/volume1/een/ander/pad/;
Correctie : geen ; maar een : en zonder / op het eind.
Zo dus :
gebruik een dubbele punt : om elk pad te scheiden. Bijvoorbeeld:/etc:/tmp:/usr/bin/php
https://www.synology.com/nl-nl/knowledgebase/DSM/help/WebStation/application_webserv_php
-
Hallo Wyodor,
nadat mijn openbase_dir is aangepast naar:
/volume1/Gedeelde Map
krijg ik de foutmelding: No input file specified.
In de Gedeelde Map staan alleen foto's (.jpg) waarnaar ik vanuit de webapplicatie wil verwijzen.
Hij vindt dus iets niet. Wat zou er mis kunnen zijn?
mvg
-
Er is niks mis mee.
Met openbasedir kan alleen PHP daar bij.
Om bijvoorbeeld een csv bestand te lezen.
Zoals in eerste instantie de vraag was.
Het is niet bedoeld om afbeeldingen in een webpagina te tonen.
De webserver (apache) kan daar niet bij.
Als je dat wilt, moet je een symbolic link naar die map maken.
Of je moet met PHP een afbeelding openen en met <img src="<?php echo toonafbeelding.php; ?>"> in een webpagina tonen.
Met code zoals hier uitgelegd :
https://www.php.net/manual/en/function.readfile.php
Maar zoals gezegd, dat was de vraag niet.
-
Hier een voorbeeld zonder enige aanpassing bij instellingen waar dan ook.
Bestandsnaam : toonafbeelding.php
<?php
$file = '/volume1/photo/Devolo/Devolo 001.jpg';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
HTML code in : toonafbeelding.html
Je hoef geen echo te doen, alleen een link naar het PHP bestand.
<img src="toonafbeelding.php" style="width: 220px;" />
Wil je meer fotos tonen dan gebruik je scandir of glob
https://www.php.net/manual/en/function.scandir.php
https://www.php.net/manual/en/function.glob.php
-
Wyodor,
misschien begrijpen we elkaar niet helemaal, maar ik heb in elk geval al veel bijgeleerd.
Mijn PHP/MySQL-webapplicatie kan een csv-file importeren in de database, dat lukt prima.
Die csv-file bevat verwijzingen naar jpg's.
Echter: die csv-file ligt in een map onder de standaard-map 'web'.
Ik zou graag willen dat die csv-file buiten de standaard-map web ligt en dat de applicatie die kan importeren.
Bijv in de standaard map "Gedeelde Map". Duidelijker kan ik het niet maken, maar vraag rustig als je iets mist.
Wat er momenteel gebeurt als ik bij open_basedir invul: /volume1/Gedeelde Map, is de foutmelding: No inputfile specified
zodra ik in de browser mijn applicatie start. Als open_basedir leeg blijft werkt de applicatie weer maar kom ik dus niet buiten de map 'web'.
mvg
-
Dit is een oplossing die bij mij werkte.
Na het aanmaken van een gedeelde map kreeg ik de melding No input file specified als ik een plaatje wilde tonen met de eerder genoemde PHP code.
In het PHP profile in webstation vinkje gezet bij openbasedir, gedeelde map path ingevuld en op OK geklikt.
Foutmelding bleef.
Vinkje je weer uitgezet en toen werkte alles.
Vraag mij niet waarom.
-
Om de afbeeldingen in een Gedeelde Map, of elders, in een web pagina album te tonen, heb ik dit bedacht.
Drie bestanden:
albumpath.txt
albumafbeelding.php
album.php
albumpath.txt is een tekstbestand dat de pathnaam naar een map ergens op de server bevat.
Dit bijvoorbeeld :
/volume1/Gedeelde Map/
Wil je een andere map tonen, verander je de path naam.
albumafbeelding.php is een PHP bestand dat de afbeelding ophaald en uitvoert :
<?php
$photo = $_GET['photo'];
$path = file_get_contents('albumpath.txt');
$file = $path . $photo;
if ( file_exists( $file ) )
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit();
}
?>
album.php is de webpagina die naar de browser wordt gestuurd en moet je naar eigen inzicht inrichten.
<h2>Photo Album</h2>
<style>
figure {
display:inline-block;
width: 250px;
margin: 0.500em;
}
figure img {
width: 100%;
}
figcaption {
text-align: center;
}
</style>
<?php
$path = file_get_contents('albumpath.txt');
$extensions = array("jpg", "jpeg", "png", "gif");
if ( $files = scandir( $path ) )
{
foreach ( $files as $image )
{
$imageFileType = strtolower( pathinfo( $image, PATHINFO_EXTENSION ) );
if( in_array( $imageFileType , $extensions ) )
{
$path_parts = pathinfo( $image );
$title = $path_parts['filename'];
$size = getimagesize( $path . $image );
$maxwidth = $size[0];
?>
<figure>
<img src="albumafbeelding.php?photo=<?php echo $image; ?>" style="max-width: <?php echo $maxwidth; ?>px;" />
<figcaption><?php echo $title; ?></figcaption>
</figure>
<?php
}
}
}
?>
-
Het probleem is dat nadat ik het vinkje van open_basedir heb aangevinkt, mijn webappl niet meer start maar de foutmelding "No input file specified" geeft. Als ik het vinkje weghaal heb ik de oude situatie weer, dwz applicatie werkt weer met oude probleem.
Ik ga met jouw voorbeeld eens stoeien.
mvg
-
Hoe kan ik vanuit een submap - zoals 'web' - een file benaderen in "Gedeelde map" (die een niveau hoger ligt)?
Welke rechten moeten daarvoor waar worden gezet?
Ik heb al zitten stoeien met de machtigingen, maar het bestand in "Gedeelde map" blijft niet te openen.
Enig idee?
-
Of, en zo ja hoe zoiets kan hangt af van wat je precies wil.
Maar je vraag is redelijk vaag.
Wil je vanuit de web-folder, bijv. middels een Include of PHP script bestanden elders (dan in de web-folder of subfolder daarvan) als web-pagina included of aanspreken?
Wil je vanuit een bestands-browser (bijv. Windows File Explorer of Finder) een bestand in een andere share (gedeelde folder) op je NAS kunnen openen of aanspreken?
Of wil je .... ?
-
In dit topic kwam het ook ter sprake :
https://www.synology-forum.nl/web-server/webapplicatie/
-
Ik zal het probleem nog eens voorleggen:
ik heb een php/mysql-applicatie die ligt - standaard - in de map: 'web'.
in een tabel in de database staan verwijzingen naar foto's; die foto's staan in een submap van 'web'.
de foto's wil ik echter buiten de map 'web' hebben, bijv in een gedeelde map.
als ik op een verwijzing naar een foto klik, zie ik de foto als die tenminste in een submap van 'web' staat.
een verwijzing naar een foto in een gedeelde map gaat mis; daar heb ik niet de machtiging voor.
Welke machtiging moet ik dan waaraan toekennen?
Heb al van alles geprobeerd, maar helaas.
Iemand een tip?
-
Je zou aan de gedeelde map de gebruiker 'http' kunnen toevoegen met lees bevoegdheid.
-
Wyodor, ik heb je advies opgevolgd maar:
Warning: scandir(/volume1/Gedeelde Map): failed to open dir: Permission denied in /volume1/web/fev/invoeren1.php on line 74
Het php-bestand probeert /volume1/Gedeelde Map te benaderen.
-
Op die permissies heb ik geen kijk. Anders dan proberen.
Voor de goede orde.
Bestanden buiten de web map kan je niet tonen in een webpagina met een gebruikelijke link.
Apache mag dat niet.
Je moet óf een symbolic link maken óf de bestanden tonen met PHP headers, zoals eerder uitgelegd.
https://www.synology-forum.nl/index.php?topic=39934.msg285142#msg285142 (https://www.synology-forum.nl/index.php?topic=39934.msg285142#msg285142)
-
Bedankt Wyodor,
ik ga je uitleg bij mijn vorige vraag (waar je naar verwijst) nog eens bestuderen.
mvg
-
Probeer eens om de map met de te benaderen files toe te voegen aan openbasedir. Dit vindt je in Web Station onder php-instellingen (oid) in het profiel voor de php versie die je gebruikt. Volgens mij kan php en om veiligheidsredenen default geen files benaderen buiten de gedeelde map web.
-
De twee Topics samengevoegd, gaat volgens mij over hetzelfde.
-
Vanuit Webstation - PHP instellingen - Kies de versie die je gebruikt bv PHP 7.3 - Algemene instellingen - Vinkje bij openbase_dir en pad daar toevoegen.
Daarmee geef je PHP rechten op andere mappen buiten /web. De rechten op die map moeten dan wel toegankelijk zijn voor de http user.
En het is natuurlijk een security overweging.
-
hoorna,
Ik heb het pad met de te benaderen files toegevoegd aan openbasedir van de gebruikte php-versie.
Helaas kan php inderdaad geen files benaderen buiten de map 'web', want het werkt niet hiermee.
Dwz dat de gebruiker zijn foto's binnen de omgeving van het php-tool moet plaatsen, dus binnen de map 'web' en dat is toch wel vreemd e n niet gewenst. Maar ja, het is kennelijk niet anders......
Dank voor je hulp.
Mvg
-
bartmans99,
ik heb je advies opgevolgd, maar helaas zonder succes.
Ik lees elders dat php niet op andere mappen buiten 'web' kan komen?
Bedankt,
mvg
-
Je schrijft niet hoe je het pad in openbasedir hebt opgegeven.
Stel dat de naam van de gedeelde map is: gedeelde-map. Dan moet je het volgende pad opgegeven: /var/services/gedeelde-map. Als je meerdere mappen/paden wilt opgeven dan moet je die scheiden met een dubbele punt. Én je moet natuurlijk -zoals baardmans99 schrijft - de user http leesrechten geven op de gedeelde map/gedeelde mappen.
Bij mij heeft dit in heeft dit gewerkt.
-
In openbasedir HAD ik alleen de naam van de betreffende map ingevuld, dwz /volume1/MIJNMAP
Ik heb er nu van gemaakt: /var/services/MIJNMAP
Het resultaat is hetzelfde: als ik mijn webapplicatie via de browser wil starten krijg ik de melding: No input file specified.
Het blijft een raadsel, maar ik zoek verder.
Mvg
-
De melding “no input file specified” klinkt niet naar een toegangsprobleem. Het lijkt mij dat er dat een probleem is met de filenaam zelf. Immers php zegt: “er is geen file opgegeven”.
-
Daar heb je gelijk in, maar kan er ook op wijzen dat er 'verkeerd wordt gekeken".
In elk geval heb ik zojuist in alle rust alles nog eens bekeken, maar het lijkt erop dat je gewoon niet buiten de 'web'-map mag komen ondanks aanpassing in open_basedir.
In de help staat nog:
"Om veiligheidsredenen kunnen paden voor de gedeelde map homes (bijv. /volume1/homes) niet worden toegevoegd aan open_basedir."
maar ik verwijs ook niet naar homes, maar naar een eigen gedeelde map op hetzelfde niveau: /volume1/MIJNMAP
mvg