Is er een manier om de initiator van een php script te achterhalen?
Ik bedoel: stel, er is een index.html. In deze html zit een link naar mijnscript.php. Is het dan mogelijk om in mijnscript.php te achterhalen dat deze gestart is door index.html

Ik wil er namelijk zeker van zijn dat de script aangeroepen is door index.html en niet dat iemand in een browser de script aan kan roepen.
>> Ik wil er namelijk zeker van zijn dat de script aangeroepen is door index.html en niet dat iemand in een browser de script aan kan roepen.

De beste oplossing is in dat dat geval om index.php buiten de webroot te plaatsen. Dan kan het bestand niet via de browser worden aangeroepen.

Hoe ga je trouwens vanuit index.html een .php bestand aanroepen?
Kan toch met een <a href="mijnscript.php">klik hier</a> (bijvoorbeeld?)

Wat ik heb gedaan is natuurlijk ook slechts een voorbeeld. Het gaat voor mij om het principe: is het mogelijk om de script/html te achterhalen in een php script, die het script gestart heeft. Je hebt ook __FILE__ die de scriptnaam teruggeeft. Dus zoiets, maar dan de aanroepende file. Ik ben al een hele tijd aan het zoeken op internet, maar nog niets gevonden. Ook met $_SERVER kan je veel opvragen, maar niet de aanroeper. En als het niet kan, dan is dat maar zo.
<?php
echo '<pre>' . print_r($_SERVER, true) . '</pre>';
?>

En bestudeer de resultaten ;-)
Paul van der Kroon op 08/09/2020 23:48:59

Kan toch met een <a href="mijnscript.php">klik hier</a> (bijvoorbeeld?)

oké, maar dit is in feite ook gewoon een rechtstreekse aanroep, en als ik je goed begrijp wat dat nu net niet de bedoeling.

Wat wil je precies bereiken? Als je even uitlegt wat je wil, en waarom, dan kunnen we je een passende oplossing geven.
>> <a href="mijnscript.php">klik hier</a>

Dit is slechts een snelkoppeling. Hiermee wordt je pagina nog niet opgevraagd.

Even terug naar het begin...

> Je typt een URL in in je browser, bijvoorbeeld http://mijndomijn.nl/mijnscript.php
> De browser doet een aanvraag (request) aan de webserver
> De webserver ontdekt dat je een URL opvraagt met een .php extensie en zal OP DE SERVER het script starten.
> Als het script beëindigd is (250 milliseconden later) wordt HET RESULTAAT (of de output) van het script teruggestuurd naar de browser.
> De browser bestudeerd dit resultaat en kijkt of het HTML is of een andere data type en als het HTML is dan zal de browser deze HTML parsen ..

PHP werkt en bestaat dus enkel op de webserver. Een client heeft dus eigenlijk geen enkele invloed op een PHP script behalve dan de publiekelijk toegankelijke scripts te kiezen door de juiste URL aan te roepen.
HTTP is stateless (toestandsloos): een individueel HTTP-request wordt los van andere requests beantwoord met een HTTP-response. Wil je een HTTP-systeem in een toestand (state) brengen waarin requests wél afhankelijk zijn van elkaar, dan zul je dat zelf moeten bouwen.

In PHP worden daarvoor meestal sessies gebruikt, totdat je iets ingewikkelders of iets groters met een database nodig hebt.
Om terug te komen op de vraag.

In bestand mijnscript.html

<p><a href="mijnscript.php">naar mijnscript.php</a></p>


In bestand mijnscript.php

<?php
if ( $_SERVER['HTTP_REFERER'] == '' )
{
	echo '<p>Geen referer</p>';
}
if ( $_SERVER['HTTP_REFERER'] <> '' )
{
	echo '<p>Komt van <b>' . $_SERVER['HTTP_REFERER'] . '</b></p>';
}
?>

<p>Ga terug naar <a href="mijnscript.html">mijnscript.html</a>.</p>

<p><a href="mijnscript.php">Toon de pagina</a></p>

<p>Of klik in het adresveld van de browser en doe return.</p>
Let wel op dat HTTP_REFERER gemanipuleerd kan worden, en onbetrouwbaar kan zijn. Doe er dus geen belangrijke dingen mee.
Dank voor alle reacties. De oplossing van Adoptive Solution geeft in beide gevallen "Geen referer". HTTP_REFERER komt ook niet voor bij de server opties.

Ik kreeg altijd van mijn provider een statistiek opgestuurd, met ook vanwaar de website geopend was (dus bijv via Google of een link van een andere pagina). Daarom had ik het vermoeden dat dat ook wordt meegegeven aan het http request en dat het op te vragen is. Blijkbaar is dat niet zo.
Item kan wat mij betreft gesloten worden.
Indien het niet de bedoeling is dat iemand rechtstreeks een PHP-bestand aanroept, omdat deze ingevoegd wordt (een zogenaamde include) in een ander bestand, dan zul je voorzieningen moeten treffen om dit te voorkomen. Dit kun je bijvoorbeeld bewerkstelligen door dit soort bestanden buiten de webdirectory te plaatsen.

Uit het bovenstaande verhaal wordt niet echt duidelijk wat er aan de hand is. Je zou altijd de access- en wellicht ook je errorlogs kunnen raadplegen om te kijken welke pagina's / bestanden worden opgevraagd en welke statussen worden teruggegeven (zie hieronder).

Een bezoeker of bot kan altijd een niet-bestaande pagina opvragen. Hoe jouw website hier op reageert hangt af van hoe deze geprogrammeerd is. Als je bijvoorbeeld niet expliciet een 404 (pagina niet gevonden) HTTP status code teruggeeft dan zou dit zoekmachines kunnen verwarren omdat jouw site net doet alsof deze pagina "bestaat".

NB alle HTTP-directives worden volgens mij gevuld door je browser. Zoals aangegeven zijn deze niet echt betrouwbaar, noch is het gegarandeerd dat deze altijd ingevuld zijn. Je zou dus altijd eerst moeten controleren of een index bestaat met isset().

Reageren